首页 > 代码库 > HDU 3316 爆搜水题

HDU 3316 爆搜水题

爆搜水题

模拟扫雷,规则和扫雷一样

给出原图,求在X,Y位置点一下以后的图形,没有弹出的点输出-1,弹出的点输出这个点的数字

从起始点DFS一下即可

#include "stdio.h"
#include "string.h"

int dir[8][2]={ {-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1} };
int n;
int hash[110][110];
char str[110][110];


int judge(int x,int y)
{
    int sum,i,xx,yy;
    sum=0;
    for (i=0;i<8;i++)
    {
        xx=x+dir[i][0];
        yy=y+dir[i][1];
        if (xx<0 || xx>=n || yy<0 || yy>=n) continue;
        if (str[xx][yy]=='X') sum++;
    }
    return sum;

}
void dfs(int x,int y)
{
    int sum,i;
    if (x<0 || y<0 || x>=n || y>=n) return ;
    if (str[x][y]=='X') return ;
    if (hash[x][y]!=-1) return ;

    sum=judge(x,y);
    hash[x][y]=sum;
    if (sum==0)
    {
        for (i=0;i<8;i++)
            dfs(x+dir[i][0],y+dir[i][1]);

    }
    else
    return ;
}
int main()
{
    int i,j,x,y;
    while (scanf("%d",&n)!=EOF)
    {
        for (i=0;i<n;i++)
            scanf("%s",str[i]);
        scanf("%d%d",&x,&y);
        if (str[x][y]=='X')
        {
            printf("it is a beiju!\n\n");
            continue;
        }

        memset(hash,-1,sizeof(hash));
        dfs(x,y);
        for (i=0;i<n;i++)
        {
            for (j=0;j<n;j++)
                if (hash[i][j]==-1) printf(".");
                else printf("%d",hash[i][j]);
            printf("\n");
        }
        printf("\n");
    }
    return 0;
}


HDU 3316 爆搜水题