题目链接:
https://vijos.org/p/1015
题目大意:
n*m的网格,线只能在网格的顶点处才能从布的一面穿到另一面。每一段线都覆盖一个单位网格的两条对角线之一,而在绣的过程中,一针中连续的两段线必须分处布的两面。
给出布两面的图案,问最少需要几针才能绣出来?一针是指针不离开布的一次绣花过程。
题目思路:
【宽搜】或【并查集】
正面的如果有线就把端点连正边,反面连负边。
一针就是从正边到反边再到正边这样循环下去。用宽搜写floodfill(或者并查集)把一次走到线路抠出来,线路上|正边数-反边数|/2为该线路的针数。
感觉自己说不太清楚,引用大牛zhymaoiing的话:
将正面的边视为正边,反面的则视为负边。用floodfill将由正边和负边交替连接的结点组成一个块。对于每一个块,其中的所有结点的正边数目和负边数目之差的绝对值(定为dep)之后div 2后就为这个块的所需针数。
在一个块中只用一针就可完成,假设该针由v1出发,到vn结束,那么v1到vn中间的点的dep为0,而v1和vn则为1。也就是说块中的那一针在v1有一个入口,在vn有一个出口,而每一对入口和出口就代表了一针,那么就可以通过dep之和除以2得到所需针数。由此可以拓宽到多针。
BFS
千万不要点
1 / 2 //by coolxxx 3 // 4 #include5 #include 6 #include<string> 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include<string.h> 13 #include 14 #include 15 #define min(a,b) ((a)<(b)?(a):(b)) 16 #define max(a,b) ((a)>(b)?(a):(b)) 17 #define abs(a) ((a)>0?(a):(-(a))) 18 #define lowbit(a) (a&(-a)) 19 #define sqr(a) ((a)*(a)) 20 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b)) 21 #define eps 1e-8 22 #define J 10 23 #define MAX 0x7f7f7f7f 24 #define PI 3.1415926535897 25 #define N 207 26 using namespace std; 27 int n,m,lll,ans,cas; 28 char map[2][N][N]; 29 bool u[N][N]; 30 bool f; 31 void floodfill(int i,int j) 32 { 33 int t=0,k; 34 if(u[i][j])return; 35 u[i][j]=1; 36 if(i>1 && j>1) 37 { 38 for(k=0;k<2;k++) 39 { 40 if(map[k][i-1][j-1]=='\\' || map[k][i-1][j-1]=='X') 41 { 42 t=t+(-2)*k+1; 43 f=1; 44 floodfill(i-1,j-1); 45 } 46 } 47 } 48 if(i>1 && j<=m) 49 { 50 for(k=0;k<2;k++) 51 { 52 if(map[k][i-1][j]=='/' || map[k][i-1][j]=='X') 53 { 54 t=t+(-2)*k+1; 55 f=1; 56 floodfill(i-1,j+1); 57 } 58 } 59 } 60 if(i<=n && j>1) 61 { 62 for(k=0;k<2;k++) 63 { 64 if(map[k][i][j-1]=='/' || map[k][i][j-1]=='X') 65 { 66 t=t+(-2)*k+1; 67 f=1; 68 floodfill(i+1,j-1); 69 } 70 } 71 } 72 if(i<=n && j<=m) 73 { 74 for(k=0;k<2;k++) 75 { 76 if(map[k][i][j]=='\\' || map[k][i][j]=='X') 77 { 78 t=t+(-2)*k+1; 79 f=1; 80 floodfill(i+1,j+1); 81 } 82 } 83 } 84 lll+=abs(t); 85 } 86 int main() 87 { 88 #ifndef ONLINE_JUDGE 89 // freopen("1.txt","r",stdin); 90 // freopen("2.txt","w",stdout); 91 #endif 92 int i,j,k; 93 // while(~scanf("%s",s1)) 94 while(~scanf("%d",&n)) 95 // for(scanf("%d",&cas),l=1;l<=cas;l++) 96 { 97 memset(u,0,sizeof(u)); 98 ans=0; 99 scanf("%d",&m); 100 for(k=0;k<2;k++) 101 for(i=1;i<=n;i++) 102 scanf("%s",map[k][i]+1); 103 for(i=1;i<=n+1;i++) 104 { 105 for(j=1;j<=m+1;j++) 106 { 107 lll=f=0; 108 floodfill(i,j); 109 if(f && lll==0)ans++; 110 else ans+=lll/2; 111 } 112 } 113 printf("%d\n",ans); 114 } 115 return 0; 116 } 117 118 /* 119 // 120 121 // 122 */
并查集
千万不要点
1 // 2 //by coolxxx 3 // 4 #include5 #include 6 #include<string> 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include<string.h> 13 #include 14 #include 15 #define min(a,b) ((a)<(b)?(a):(b)) 16 #define max(a,b) ((a)>(b)?(a):(b)) 17 #define abs(a) ((a)>0?(a):(-(a))) 18 #define lowbit(a) (a&(-a)) 19 #define sqr(a) ((a)*(a)) 20 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b)) 21 #define eps 1e-8 22 #define J 10 23 #define MAX 0x7f7f7f7f 24 #define PI 3.1415926535897 25 #define N 207 26 using namespace std; 27 int n,m,lll,ans,cas,cass; 28 int a[N*N],b[N*N],fa[N*N],c[N*N]; 29 bool u[N*N],v[N*N]; 30 char map[2][N][N]; 31 int zhao(int aa) 32 { 33 if(fa[aa]==-1)return aa; 34 return fa[aa]=zhao(fa[aa]); 35 } 36 int main() 37 { 38 #ifndef ONLINE_JUDGE 39 // freopen("1.txt","r",stdin); 40 // freopen("2.txt","w",stdout); 41 #endif 42 int i,j,k,x,y,fx,fy; 43 // while(~scanf("%s",s1)) 44 while(~scanf("%d",&n)) 45 // for(scanf("%d",&cas),cass=1;cass<=cas;cass++) 46 { 47 memset(fa,-1,sizeof(fa)); 48 memset(a,0,sizeof(a)); 49 memset(b,0,sizeof(b)); 50 memset(u,0,sizeof(u)); 51 memset(v,0,sizeof(v)); 52 ans=0;c[0]=0; 53 scanf("%d",&m); 54 for(k=0;k<2;k++) 55 for(i=0;i ) 56 scanf("%s",map[k][i]); 57 for(k=0;k<2;k++) 58 { 59 for(i=0;i ) 60 { 61 for(j=0;j ) 62 { 63 if(map[k][i][j]=='\\' || map[k][i][j]=='X') 64 { 65 x=i*(m+1)+j;y=(i+1)*(m+1)+j+1; 66 fx=zhao(x);fy=zhao(y); 67 if(fx!=fy) 68 fa[fy]=fx; 69 a[x]+=(-2)*k+1; 70 a[y]+=(-2)*k+1; 71 v[x]=v[y]=1; 72 } 73 if(map[k][i][j]=='/' || map[k][i][j]=='X') 74 { 75 x=i*(m+1)+j+1;y=(i+1)*(m+1)+j; 76 fx=zhao(x);fy=zhao(y); 77 if(fx!=fy) 78 fa[fy]=fx; 79 a[x]+=(-2)*k+1; 80 a[y]+=(-2)*k+1; 81 v[x]=v[y]=1; 82 } 83 } 84 } 85 } 86 for(i=0;i<(n+1)*(m+1);i++) 87 { 88 if(!v[i])continue; 89 j=zhao(i); 90 if(!u[j])u[j]=1,c[++c[0]]=j; 91 b[j]+=abs(a[i]); 92 } 93 for(i=1;i<=c[0];i++) 94 { 95 if(b[c[i]]==0)ans++; 96 else ans+=b[c[i]]/2; 97 } 98 printf("%d\n",ans); 99 } 100 return 0; 101 } 102 103 /* 104 // 105 106 // 107 */