Oil Deposits 油田
GeoSurvComp地质调查公司负责探测地下石油储量。GeoSurvComp 一次与一个大型矩形土地区域配合工作,并创建一个网格,将土地划分为多个方块。然后,它分别分析每个绘图,使用感应设备确定该地块是否含有油。含有油的地块称为口袋。如果两个口袋相邻,则它们是同一油藏的一部分。石油储量可能相当大,可能含有许多口袋。您的工作是确定网格中包含多少不同的油藏。
输入
输入包含一个或多个网格。每个网格以包含 m 和 n 的线开始,网格中的行和柱数由单个空间分开。如果m=0它表示输入的结束:否则 1 < = m < = 100 和 1 < = n < = 100 。下面是每个n字符的m行(不包括行尾字符)。每个字符对应于一个绘图,并且是"*",表示缺少油,或表示油袋的"@"。
输出
水平、垂直或对角线相邻。油藏不会包含超过100个口袋。
示例输入
1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0
样本输出
0 1 2 2
不同的坐标表示形式,搜索时坐标代表含义不同,具体看代码
题意描述:
给n*m个数据,*表示没有油,@表示有油,如果@水平、垂直或对角线相邻,代表一个油田,求油田个数
解题思路:
利用深搜dfs,找到@开始遍历,深搜分八个方向,当走到的地方没有超届并且没有被标记过,就将这个地方标记成没有油田,以该点为起点继续遍历,直到搜索完,输出油田个数。
AC代码
# include <cstdio> # include <iostream> using namespace std; char abc[120][120]; int m,n; int i,j,k; int ans; int a[8]={-1,-1,0,1,1,1,0,-1};//等同 int vis[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0]},{1,-1},{0,-1},{-1,-1}} int b[8]={0,1,1,1,0,-1,-1,-1}; void dfs(int x,int y) { int k; if(x<0 || y<0) return; //这里的return返回很重要!!回溯 if(abc[x][y]=='@') { abc[x][y]='*'; for(k=0;k<8;k++) dfs(x+a[k],y+b[k]); //等同int dx=x+vis[i][0]; //int dy=y+vis[i][1]; } return; } int main() { int m,n; while(scanf("%d%d",&m,&n)!=EOF&&(m||n)) { int i,j; int ans=0; for(i=0;i<m;i++) scanf("%s",abc[i]); for(i=0;i<m;i++) { for(j=0;j<n;j++) { if(abc[i][j]=='@') { ans++; dfs(i,j); } } } printf("%d\n",ans); } return 0; }

浙公网安备 33010602011771号