ZOJ1047 || POJ1111

求周长,一开不知道怎么求,最后钻到POJ讨论区内,看到一种方法,就是‘X"周围全换成0,最后只要求0的个数就好了

嗯,这种方法真好,反正我们想起来,膜拜啊!这题过了从网上搜了下发现可以用BFS做,想想也是,本身用那一种都行

View Code
 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           
posted @ 2012-06-04 23:25  zhongya  阅读(155)  评论(0编辑  收藏  举报