如果想在DFS过程中计算油田个数会很麻烦,所以要简化思想。我们可以把每一个油田当成一次DFS(只对"@"的进行DFS,这样每当DFS退出时,表示一块油田搜索完毕 ),这样每次DFS后油田数加一,最后输出结果。
#include<stdio.h> #include<string.h> char map[101][101]; int oil; int m,n; bool book[101][101]; int next[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}}; //存储8个方向 bool iforder(int x,int y){ //判断是否越界 if(x<0||x>=m||y<0||y>=n) return true; return false; } void dfs(int x,int y){ if(map[x][y]=='*') //跳过“*” return; for(int i=0;i<8;i++){ int tx=x+next[i][0]; int ty=y+next[i][1]; if(iforder(tx,ty)||book[tx][ty]) //跳过已经搜索过或者越界的 continue; book[tx][ty]=1; if(map[tx][ty]=='@') dfs(tx,ty); } } int main(){ scanf("%d %d",&m,&n); while(m!=0&&n!=0){ for(int i=0;i<m;i++) scanf("%s",&map[i]); memset(book,0,sizeof(book)); oil=0; for(int i=0;i<m;i++) for(int j=0;j<n;j++){ if(!book[i][j]&&map[i][j]!='*') { dfs(i,j); oil++; //每次DFS后油田数+1 } } printf("%d ",oil); scanf("%d %d",&m,&n); } }