UVA657 The die is cast(DFS、BFS)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=598

这题题意看了老半天 让求图形中的X的区域块数 每个区域有多少个X是不相连的 DFS搜有多少个区域 BFS标记 有每个区域里多少X区域块

注意两点吧 WA了5次 第一个可能为X 就直接BFS 再DFS

第二 BFS中遇到的*要保留起来 把相连的X标记完之后 继续搜 不然区域块数会被分开

View Code
  1 #include <iostream>
  2 #include<cstdio>
  3 #include<string.h>
  4 #include<algorithm>
  5 void dfs(int x,int y);
  6 char c[51][51];
  7 int f[51][51],a[4][2] = {{1,0},{0,1},{-1,0},{0,-1}},num,n,m,tx,ty;
  8 using namespace std;
  9 int judge(int x,int y)
 10 {
 11     if(x<1||y<1||x>n||y>m)
 12     return 0;
 13     if(c[x][y]=='.')
 14     return 0;
 15     return 1;
 16 }
 17 
 18 void bfs(int x,int y)
 19 {
 20     int d = 1,p = 0,q[3000][2],i,flag = 0,aa[1000][2],g = 1;
 21     q[1][0] = x;
 22     q[1][1] = y;
 23     f[x][y] = 1;
 24     while(p!=d)
 25     {
 26         p++;
 27         for(i = 0 ; i < 4 ; i++)
 28         {
 29             int px = q[p][0]+a[i][0];
 30             int py = q[p][1]+a[i][1];
 31             if(judge(px,py)&&!f[px][py])
 32             {
 33                 if(c[px][py]=='X')
 34                 {
 35                     f[px][py] = 1;
 36                     q[++d][0] = px;
 37                     q[d][1] = py;
 38                 }
 39                 else
 40                 {
 41                     g++;
 42                     aa[g][0] = px;
 43                     aa[g][1] = py;
 44                 }
 45             }
 46         }
 47     }
 48     for(i = 1; i <= g; i++)
 49     dfs(aa[i][0],aa[i][1]);
 50 }
 51 void dfs(int x,int y)
 52 {
 53     int i,j,k;
 54     for(i = 0 ; i < 4 ; i++)
 55     {
 56         int px = x+a[i][0];
 57         int py = y+a[i][1];
 58         if(judge(px,py))
 59         {
 60             if(!f[px][py])
 61             {
 62                 if(c[px][py]=='*')
 63                 {
 64                     f[px][py] = 1;
 65                     dfs(px,py);
 66                 }
 67                 else
 68                 {
 69                     num++;
 70                     bfs(px,py);
 71                 }
 72             }
 73         }
 74     }
 75 
 76 }
 77 int main()
 78 {
 79     int i,j,k = 0,t,to[3000];
 80     while(scanf("%d %d",&m,&n)!=EOF)
 81     {
 82         if(n==0&&m==0)
 83         break;
 84         k++;
 85         memset(f,0,sizeof(f));
 86         for(i = 1; i <= n; i++)
 87         {
 88             getchar();
 89             for(j = 1; j <= m ; j++)
 90             {
 91                 c[i][j] = getchar();
 92             }
 93         }
 94         int g = 0;
 95         for(i = 1; i <= n ; i++)
 96         for(j = 1; j <= m ; j++)
 97         if(!f[i][j]&&(c[i][j] == '*'||c[i][j]=='X'))
 98         {
 99             f[i][j] = 1;
100             num = 0;
101             if(c[i][j] == 'X')
102             {
103                 num = 1;
104                 bfs(i,j);
105             }
106             dfs(i,j);
107             if(num>0&&num<7)
108             to[g++] = num;
109         }
110         sort(to,to+g);
111         printf("Throw %d\n",k);
112         for(i = 0 ; i < g ; i++)
113         {
114             if(i!=0)
115             printf(" ");
116             printf("%d",to[i]);
117         }
118         puts("");
119         puts("");
120     }
121     return 0;
122 }

附组数据

6 6

...XX*

.....X

...XX.

.....X

..XX..

....*X

Throw 1

1 1 1 1 2

6 6

...XX*

.....X

...XX*

.....X

...X**

.....X

Throw 2

6

原文地址:https://www.cnblogs.com/shangyu/p/2633042.html