题目链接~~>
开始看这题时第一眼就觉得很难,但是今天做了一下也不过如此,因为一个标记放错了,但是大多数的数据都对 ,wa了好几次,中间差点忍不住 百度一下,以为有什么特殊数据,但是还是忍住了,仔细又看了一次终于把错误找了出来。
代码:
#include<stdio.h> #include<string.h> int n,m ; int vis[60][60] ; char s[60][60] ; int a[60][60][4] ; int dx[4]={0,-1,0,1},dy[4]={-1,0,1,0} ; void dfs(int x,int y) { int nx,ny ;//开始把 int f=1 ;放在这错了好久。。。。 for(int i=0;i<4;i++)//左 上 右 下 { nx=x+dx[i] ; ny=y+dy[i] ; int f=0 ; if(nx>=0&&nx<n&&ny>=0&&ny<m&&!vis[nx][ny]) { if(!i&&a[x][y][0]&&a[nx][ny][2]) f=1 ; else if(i==1&&a[x][y][1]&&a[nx][ny][3]) f=1 ; else if(i==2&&a[x][y][2]&&a[nx][ny][0]) f=1 ; else if(i==3&&a[x][y][3]&&a[nx][ny][1]) f=1 ; if(f) { vis[nx][ny]=1 ; dfs(nx,ny) ; } } } } int main() { int i,j ; int g[12][4]={{1,1,0,0},{0,1,1,0},{1,0,0,1},{0,0,1,1},//存储管道接口 {0,1,0,1},{1,0,1,0},{1,1,1,0},{1,1,0,1}, {1,0,1,1},{0,1,1,1},{1,1,1,1}} ; while(scanf("%d%d",&n,&m)!=EOF) { if(n<0||m<0) break ; for(i=0;i<n;i++) scanf("%s",s[i]) ; memset(vis,0,sizeof(vis)) ; for(i=0;i<n;i++) for(j=0;j<m;j++) { int mx=s[i][j]-'A' ; for(int k=0;k<4;k++) a[i][j][k]=g[mx][k] ; } int sum=0 ; for(i=0;i<n;i++) for(j=0;j<m;j++) if(!vis[i][j]) { sum++ ; vis[i][j]=1 ; dfs(i,j) ; } printf("%d\n",sum) ; } return 0 ; }