明明不是难题,只要两层dfs。做了好久好久。。。
首先输入完,第一层dfs要先找 * 号 ,找到 * 号后在里面嵌一层dfs再找 X ;
两层dfs写法基本一样,注意的是标记是否访问过,要用两个数组,vis,visx分开。
因为最后要排序,所以存的时候直接把出现1点的次数存进fin[ 1 ].
最后输出把fin数组按顺序输出。。
AC代码
#include<stdio.h>
const int N = 50 + 5;
char dice[N][N];
bool vis[N][N];
bool visx[N][N];
int fin[7];
int T = 1;
int count ;
void init() {
for (int i = 0; i < N ;i++) {
for (int j = 0 ; j < N ;j++) {
dice[i][j] = '.';
vis[i][j] = false;
visx[i][j] = false;
}
}
count = 0;
}
void dfs2 (int x,int y) {
if (dice[x][y] != 'X' || visx[x][y] == true )
return ;
visx[x][y] = true;
dfs2( x- 1,y);
dfs2(x ,y - 1);
dfs2(x , y + 1);
dfs2(x + 1 , y);
}
void dfs(int x,int y) {
if (dice[x][y] == '.' || vis[x][y] == true)
return ;
vis[x][y] = true;
if (dice[x][y] == 'X' && visx[x][y] == false) {
count++;
dfs2(x,y);
}
dfs(x - 1,y);
dfs(x ,y - 1);
dfs(x , y + 1);
dfs(x + 1 , y);
}
int main () {
int n,m;
while (scanf("%d%d",&n,&m)) {
getchar();
if (n == 0 && m == 0)
break;
init();
for (int i = 1; i <= m;i++) {
for (int j = 1;j <= n ;j++) {
scanf("%c",&dice[i][j]);
}
getchar();
}
printf("Throw %d\n",T++);
for (int i = 1 ; i <= m ;i++) {
for (int j = 1; j <= n ;j++) {
dfs(i,j);
fin[count]++;
count = 0;
}
}
int flag = 0;
for (int i = 1; i <= 6; i++) {
if(fin[i] != 0){
if(flag == 0)
printf("%d",i);
else
printf(" %d",i);
flag = 1;
fin[i]--;
i--;
}
}
if (flag == 0)
printf("0\n");
printf("\n\n");
}
return 0;
}