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