题意就是扫雷 问最少多少次可以把图点开……
思路也很明显 就是先把所有的标记一遍 就当所有的都要点……
录入图……
所有雷都不标记……
之后呢 遍历图……
然后碰到0就搜索一圈 碰到数字就标记……
不难 但是卡了好久……
直接上代码……
#include<stdio.h>
#include<string.h> char s[][];
bool vis[][];
int n;
int dx[]={,,,-,,-,,-};
int dy[]={,-,,,-,,,-}; void dfs(int x,int y){
if(!vis[x][y]) return ;
if(x<&&x>n&&y<&&y>n) return ;
vis[x][y]=false;
if(s[x][y]!='') return ;
else{
for(int i=;i<;i++)
dfs(x+dx[i],y+dy[i]);
}
} int main(){
int T;
scanf("%d",&T);
int time=;
while(T--){
scanf("%d",&n);
memset(vis,true,sizeof(vis));
char ss[];
for(int i=;i<=n;i++){
scanf("%s",ss);
for(int j=;j<n;j++){
s[i][j+]=ss[j];
if(s[i][j+]=='@') vis[i][j+]=false;
}
}
/*puts("");
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%c",s[i][j]);
}
puts("");
}
puts("");*/
int sum=;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(s[i][j]==''&&vis[i][j]){
sum++;
dfs(i,j);
}
}
}
/*for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%c",vis[i][j]?'1':'0');
}
puts("");
}*/
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(vis[i][j]) sum++;
printf("Case %d: %d\n",time++,sum);
}
return ;
}