pku1562 Oil Deposits 油田合并(简单深搜)
题意:N*M的图中有一些'@',从该位置往四周8个位置延伸,求共有多少块互不连通的‘@’构成的块?简单的dfs便能搞定。。。
输入:
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
输出:
0
1
2
2
代码:
#include<iostream> using namespace std; char map[101][101]; //定义地图 map[][],标记油田状况 int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1}}; //搜索8个方向 int n,m,num; //表示输入的地图有n行m列 //深度优先搜索 int dfs(int x,int y) { int a,b,k; map[x][y]='*'; //访问过的都由@改为*,剪枝 for(k=0;k<8;++k) { a=x+dir[k][0]; b=y+dir[k][1]; if(a<n&&a>=0&&b<m&&b>=0&&map[a][b]=='@') dfs(a,b); } return 1; //每次递归都返回1,最后表示有多少连通块 } int main() { int i,j; while(cin>>n>>m) { if(n==0) break; num=0; for(i=0;i<n;++i) cin>>map[i]; for(i=0;i<n;++i) for(j=0;j<m;++j) if(map[i][j]=='@') num+=dfs(i,j); cout<<num<<endl; } return 0; }