标签:
FZU - 1920Time 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