题意:告诉扫雷的所有规则,主要是成片消去雷的规则,即一块四周都没有雷的地方会消失,直到周围有雷,周围有雷的地方会留下一个数字,表示周围八个方向雷的总个数。还给出了雷的分布。问至少点击几次鼠标左键,可以找出所有雷。
解法:bfs。找出全为0的区域的块数a1,给边界上的数字做上标记,再统计没被标记的非0数字个数a2, ans = a1+a2
//Memory: 236 KB
//Time: 0 MS
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <queue>
#include <cstring>
#define MAXN 110
#define MP(x,y) make_pair((x),(y))
#define FI first
#define SE second
using namespace std;
const int dir[8][2]={{0,1},{1,0},{-1,0},{0,-1},{1,1},{-1,1},{1,-1},{-1,-1}};
char ma[MAXN][MAXN];
void bfs(int x,int y)
{
queue<pair<int,int> >que;
que.push(MP(x,y));
while(que.size())
{
x=que.front().FI,y=que.front().SE;
que.pop();
if(ma[x][y]!='0')
{
ma[x][y]='*';
continue;
}
ma[x][y]='*';
for(int i=0;i<8;++i)
que.push(MP(x+dir[i][0],y+dir[i][1]));
}
}
int main()
{
//freopen("/home/moor/Code/input.txt","r",stdin);
int ncase,n,ans;
scanf("%d",&ncase);
for(int h=1;h<=ncase;++h)
{
scanf("%d",&n);
memset(ma,0,sizeof(ma));
for(int i=1;i<=n;++i)
scanf("%s",&ma[i][1]);
ans=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(ma[i][j]=='0')
bfs(i,j),++ans;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(ma[i][j]>='1'&&ma[i][j]<='8')
++ans;
printf("Case %d: %d\n",h,ans);
}
}