UVA 657 The die is cast (DFS*2)

分析:双DFS,一个搜索*,一个搜索X;(遍历完每个地方后把他变为背景‘.’)
题意就是判断X(连通算一个,四方向遍历)的个数,也就是筛子的点数。
题意很简单,但程序写起来还是有难度的,WA数次。(本题类似于古代象形符号)


#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cstdlib>
using namespace std;
const int maxn=55;
char pic[maxn][maxn];
int cnt;
int i_cmp(void const *x,void const *y)
{
    return *(int*)x-*(int*)y;
}
void dfs(int r,int c)
{
    if (pic[r][c]!='X')return ;
    else pic[r][c]='.';
    dfs(r-1,c);dfs(r,c-1);
    dfs(r,c+1);dfs(r+1,c);
}
void dfs2(int r,int c)
{
    if (pic[r][c]=='.') return ;
    if (pic[r][c]=='X')
    {
        dfs(r,c);
        cnt++;
    }
    pic[r][c]='.';
    dfs2(r-1,c);dfs2(r,c-1);
    dfs2(r,c+1);dfs2(r+1,c);
}
int main()
{
    int kase=0,dote[100];
    int n,m,ct;
    while (scanf("%d%d",&n,&m)==2&&m&&n)
    {
        memset(pic,'.',sizeof(pic));
        for(int i=1; i<=m; i++)
        {
            getchar();
            for(int j=1; j<=n; j++)
                scanf("%c",&pic[i][j]);
        }
        ct=0;
        for (int i=1;i<=m;i++)
        for (int j=1;j<=n;j++)
        {
            if (pic[i][j]=='*')
            {
                cnt=0;
                dfs2(i,j);
                dote[ct++]=cnt;
            }
        }
        printf("Throw %d\n", ++kase);
        qsort(dote,ct,sizeof(dote[0]),i_cmp);
        for(int i=0; i<ct; i++)
            {
                if(i)
                    printf(" ");
                printf("%d",dote[i]);
            }
        printf("\n\n");
    }
    return 0;
}

你可能感兴趣的:(c,uva,is,the,Die,657)