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;}