一、题目回顾
题目链接:Oil Deposits
题意:给你一块网格,网格被分为面积相等的地块,这些地块中标记'@'的是油田,标记'*'的不是油田。已知一块油田与它上下左右以及对角线的油田同属一片油区,请问总共有多少油区。
二、解题思路
- DFS经典
- 注意的就是要向八个方向搜索,搜索完一处,将该处变成石头(另一种标记)
- 答案变量在主函数内改变,而不在dfs函数内
三、代码
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int m,n,ans; char a[105][105]; //存储网格 void dfs(int x,int y) { if(x<1||x>m||y<1||y>n){ //超出边界,搜索失败 return; } if(a[x][y] == '*'){ //不是油田,搜索失败 return; } if(a[x][y]=='@'){ //是油田 a[x][y] = '*'; //标记的另一种用法 //搜索它的左右上下对角线 dfs(x-1,y-1);dfs(x-1,y);dfs(x-1,y+1);dfs(x,y-1);dfs(x,y+1);dfs(x+1,y-1);dfs(x+1,y);dfs(x+1,y+1); } } int main() { while(scanf("%d%d",&m,&n)){ if(m==0 && n==0) break; for(int i=1;i<=m;i++){ getchar(); for(int j=1;j<=n;j++){ scanf("%c",&a[i][j]); } } getchar(); ans = 0; for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ if(a[i][j] == '@'){ dfs(i,j); ans++; } } } printf("%d ",ans); } return 0; }