Description
GeoSurvComp地质调查公司负责探测地下石油储藏。 GeoSurvComp现在在一块矩形区域探测石油,并把这个大区域分成了很多小块。他们通过专业设备,来分析每个小块中是否蕴藏石油。如果这些蕴藏石油的小方格相邻,那么他们被认为是同一油藏的一部分。在这块矩形区域,可能有很多油藏。你的任务是确定有多少不同的油藏。
Input
输入可能有多个矩形区域(即可能有多组测试)。每个矩形区域的起始行包含m和n,表示行和列的数量,1<=n,m<=100,如果m =0表示输入的结束,接下来是n行,每行m个字符。每个字符对应一个小方格,并且要么是'*',代表没有油,要么是'@',表示有油。
Output
对于每一个矩形区域,输出油藏的数量。两个小方格是相邻的,当且仅当他们水平或者垂直或者对角线相邻(即8个方向)。
Sample Input
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
Sample Output
0
1
2
2
深搜题 代码给详细讲解
#include<iostream>
using namespace std;
using namespace std;
char mp[101][101]; //地图
int n, m;
int dir[8][2] = { {-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1} }; //八个方向
void dfs(int x, int y) //深搜
{
int xx, yy;
mp[x][y] = '*'; // 进来后@直接替换成*
for(int i = 0; i < 8; i++) //移动坐标
{
xx = x + dir[i][0];
yy = y + dir[i][1];
if(xx<0 || xx>=n || yy<0 || yy>=m) //筛选条件
{
continue;
}
if(mp[xx][yy] == '@') //符合了就继续搜 搜到的就换成*最后一个油田都是* 接下来再找新油田
{
dfs(xx, yy); //深搜重点
}
}
}
int n, m;
int dir[8][2] = { {-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1} }; //八个方向
void dfs(int x, int y) //深搜
{
int xx, yy;
mp[x][y] = '*'; // 进来后@直接替换成*
for(int i = 0; i < 8; i++) //移动坐标
{
xx = x + dir[i][0];
yy = y + dir[i][1];
if(xx<0 || xx>=n || yy<0 || yy>=m) //筛选条件
{
continue;
}
if(mp[xx][yy] == '@') //符合了就继续搜 搜到的就换成*最后一个油田都是* 接下来再找新油田
{
dfs(xx, yy); //深搜重点
}
}
}
int main()
{
int i, j;
int cnt; //油田数量
while(cin>>n>>m&&(m||n))
{
cnt = 0;
for(i = 0; i < n; i++)
{
cin>>mp[i]; //char型 能直接这样输入n行m列
}
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
{
if(mp[i][j] == '@')
{
dfs(i, j);
cnt++;
}
}
}
cout<<cnt<<endl;
}
return 0;
}
{
int i, j;
int cnt; //油田数量
while(cin>>n>>m&&(m||n))
{
cnt = 0;
for(i = 0; i < n; i++)
{
cin>>mp[i]; //char型 能直接这样输入n行m列
}
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
{
if(mp[i][j] == '@')
{
dfs(i, j);
cnt++;
}
}
}
cout<<cnt<<endl;
}
return 0;
}