求周长,一开不知道怎么求,最后钻到POJ讨论区内,看到一种方法,就是‘X"周围全换成0,最后只要求0的个数就好了
嗯,这种方法真好,反正我们想起来,膜拜啊!这题过了从网上搜了下发现可以用BFS做,想想也是,本身用那一种都行
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<math.h> 4 #include<string.h> 5 #include<ctype.h> 6 7 int map[25][25],f[25][25],visit[25][25],m,n; 8 int dx[] = {1,0,-1,0, 1,-1,-1, 1}; 9 int dy[] = {0,1, 0,-1,1,-1, 1,-1}; 10 11 int True(int x,int y) 12 { 13 if(x>=1&&x<=m&&y>=1&&y<=n) 14 return 1; 15 return 0; 16 } 17 18 void DFS(int x,int y) 19 { 20 int i,j,x1,y1; 21 22 visit[x][y] = 1; 23 for(i=0; i<8; i++) 24 { 25 x1 = x + dx[i]; 26 y1 = y + dy[i]; 27 if(!visit[x1][y1]&&map[x1][y1]=='X'&&True(x1,y1)) 28 { 29 visit[x1][y1] = 1; 30 f[x1][y1] = 1; 31 DFS(x1,y1); 32 } 33 } 34 } 35 36 int main() 37 { 38 int i,j,a,b,count,k; 39 40 while(scanf("%d%d%d%d",&m,&n,&a,&b) != EOF) 41 { 42 getchar(); 43 if(m==0&&n==0&&a==0&&b==0) break; 44 memset(visit,0,sizeof(visit)); 45 memset(f,0,sizeof(f)); 46 for(i=1; i<=m; i++) 47 { 48 for(j=1; j<=n; j++) 49 { 50 scanf("%c",&map[i][j]); 51 } 52 getchar(); 53 } 54 f[a][b] = 1; 55 count = 0; 56 DFS(a,b); 57 58 for(i=0; i<=m+1; i++) 59 for(j=0; j<=n+1; j++) 60 { 61 if(f[i][j]) 62 { 63 for(k=0; k<4; k++) 64 { 65 int x = i+dx[k]; 66 int y = j+dy[k]; 67 if(!f[x][y]) count++; 68 } 69 } 70 } 71 printf("%d\n",count); 72 } 73 return 0; 74 } 75