| Time Limit: 1000MS | Memory Limit: 32768KB | 64bit IO Format: %I64d & %I64u |
Description

Input
Output
Sample Input
Sample Output
扫雷,点到0点时所有连在一起的0都会显示出来,而且8个直接相邻的格子如果是数字也会显示出来,dfs处理出这一块,然后在枚举,累计所有未显示的数字就好了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int n;
vector<int> b;
int dir1[8]={0,0,-1,1,1,1,-1,-1};
int dir2[8]={-1,1,0,0,1,-1,1,-1};
char a[10][10];
bool vis[10][10];
void dfs(int x,int y)
{
vis[x][y]=true;
b.push_back(x*n+y);
for(int i=0;i<8;i++)
{
int nx=x+dir1[i];
int ny=y+dir2[i];
if(nx>=0&&nx<n&&ny>=0&&ny<n&&vis[nx][ny]==false&&a[nx][ny]=='0')
{
dfs(nx,ny);
}
}
}
int main()
{
int T;
cin>>T;
int t=1;
while(T--)
{
cin>>n;
memset(vis,false,sizeof(vis));
for(int i=0;i<n;i++)
{
for(int k=0;k<n;k++)
{
cin>>a[i][k];
if(a[i][k]=='@')
{
vis[i][k]=true;
}
}
}
int ans=0;
b.clear();
for(int i=0;i<n;i++)
{
for(int k=0;k<n;k++)
{
if(vis[i][k]==false&&a[i][k]=='0')
{
dfs(i,k);
ans++;
}
}
}
for(int i=0;i<b.size();i++)
{
int x=b[i]/n;
int y=b[i]%n;
for(int k=0;k<8;k++)
{
int nx=x+dir1[k];
int ny=y+dir2[k];
if(nx>=0&&nx<n&&ny>=0&&ny<n&&vis[nx][ny]==false)
{
vis[nx][ny]=true;
}
}
}
for(int i=0;i<n;i++)
{
for(int k=0;k<n;k++)
{
if(!vis[i][k])
{
ans++;
}
}
}
printf("Case %d: %d\n",t++,ans);
}
return 0;
}原文:http://blog.csdn.net/qq_18738333/article/details/45237627