poj 2612 Mine Sweeper 题目链接:http://poj.org/problem?id=2612
模拟水
题目大意:扫雷情境模拟,给出雷区图,给出试探区域,按规则输出。
题目分析:暴搜水题一道,重点在题意理解,if(踩到了雷)输出所有雷的位置,和试探区域情况(仅);else 输出试探区域情况。
code:
#include<stdio.h>
#include<string.h>
const int MAX=20;
char c[20][20];
int n,dir[8][2]={1,0,-1,0,0,1,0,-1,1,1,1,-1,-1,1,-1,-1};
int judge(int x,int y)
{
return x>=0&&y>=0&&x<n&&y<n&&c[x][y]=='*'?1:0;
}
int bf(int x,int y)
{
int k,count;
if(c[x][y]=='*')return -1;
for(count=k=0;k<8;k++)
{
count+=judge(x+dir[k][0],y+dir[k][1]);
}
return count;
}
int main()
{
int i,j,flag,cnt[20][20];
char query[20][20];
while(scanf("%d",&n)!=EOF)
{
flag=0;
for(i=0;i<n;i++)
{
scanf("%s",c[i]);
}
for(i=0;i<n;i++)
{
scanf("%s",query[i]);
for(j=0;j<n;j++)
{
if(query[i][j]=='x'&&c[i][j]=='*')flag=1;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cnt[i][j]=bf(i,j);
}
}
if(flag)
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(cnt[i][j]==-1)printf("*");
else printf("%c",query[i][j]!='x'?'.':cnt[i][j]+'0');
}
printf("\n");
}
else
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%c",query[i][j]!='x'?'.':cnt[i][j]+'0');
}
printf("\n");
}
}
}
PS:被多年扫雷经验坑了,一开始还以为一片'0'是要连成一块输出,要是那样就得DFS了……