UVa 657 - The die is cast
来源:互联网 发布:淘宝答题器 编辑:程序博客网 时间:2024/05/18 01:45
/* 思路:双层遍历(bfs, dfs都可以),麻烦的是需要记录访问状态。有两类方法: 1、修改原图,外层'*'访问完之后设为'.',内层'X'访问完设为'*',比较简单。 2、不修改原图, 另设标记数组,可以建2个数组分别表示内外层访问情况,也可以把两个数组合为1个(本程序用这种方法)。 结果排序用计数排序就好了,数字都在1-6范围内。*/#include <cstdio>#include <cstring>const int MAX = 50+10;int w, h;char picture[MAX][MAX];int visit[MAX][MAX];int count;int dir_x[] = {-1, 0, 1, 0};int dir_y[] = {0, 1, 0, -1};const int DIR = sizeof(dir_x)/sizeof(dir_x[0]);bool is_visit_dot(int x, int y){ if((visit[x][y] & 2) == 0) return false; return true;}void visit_dot(int x, int y){ visit[x][y] |= 2;}bool is_visit_dice(int x, int y){ if((visit[x][y] & 1) == 0) return false; return true;}void visit_dice(int x, int y){ visit[x][y] |= 1;}void dfs_dot(int x, int y){ visit_dot(x, y); for(int d=0; d<DIR; d++) { int t_x = x+dir_x[d]; int t_y = y+dir_y[d]; if(!is_visit_dot(t_x, t_y) && picture[t_x][t_y]=='X') { dfs_dot(x+dir_x[d], y+dir_y[d]); } }}void dfs_dice(int x, int y){ if(picture[x][y]=='X' && !is_visit_dot(x, y)) { count++; dfs_dot(x, y); } visit_dice(x, y); for(int d=0; d<DIR; d++) { int t_x = x+dir_x[d]; int t_y = y+dir_y[d]; if(!is_visit_dice(t_x, t_y) && picture[t_x][t_y]!='.') { dfs_dice(t_x, t_y); } }}int main (){ #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif int c=0; while(scanf("%d%d", &w, &h) == 2) { if(w==0 && h==0) break; memset(picture, '.', sizeof(picture)); memset(visit, 0, sizeof(visit)); for(int i=1; i<=h; i++) { getchar(); for(int j=1; j<=w; j++) scanf("%c",&picture[i][j]); } int dice_count[7] = {0}; for(int i=1; i<=h; i++) { for(int j=1; j<=w; j++) { if(picture[i][j]!='.' && !is_visit_dice(i, j)) { count = 0; dfs_dice(i, j); dice_count[count]++; } } } printf("Throw %d\n", ++c); bool first = true; for(int i=1; i<=6; i++) { while(dice_count[i]) { if(first) first = false; else printf(" "); printf("%d", i); dice_count[i]--; } } printf("\n\n"); } return 0;}