VJ链接(紫书P162)
题目大意:@代表油田,油田八个方向内相邻即可连接成大油田,判断有几个大油田
思路
- 用dfs遍历,遇到@就在八个方向上遍历查找,并标记这个@,防止重复查找。找到@再dfs。
- dfs一次,即为找到一个大油田,同时已经把这个油田的所有@做了标记,因此下一次再dfs,找到的即是另一个不同的油田。
回看这道题好像也不是很难,紫书虽然把这道题归到了图里面,但是用的是二维数组存储。
这道题的算法被称为种子填充,虽然写了,但还是不算很明白。有时间回来总结。
#include <iostream>
using namespace std;
char oil[105][105];
int fx[8][2]=
{
{1,0},
{1,1},
{1,-1},
{0,-1},
{0,1},
{-1,0},
{-1,1},
{-1,-1}
};
int n,m;
void dfs(int x,int y){
oil[x][y]='*';
for(int i=0;i<8;i++){
int xx=x+fx[i][0];
int yy=y+fx[i][1];
if(xx>=0 && xx<n && yy>=0 && yy<m && oil[xx][yy]=='@'){
dfs(xx,yy);
}
}
return ;
}
int main()
{
while(cin>>n>>m){
if(n==0)break;
getchar();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>oil[i][j];
}
}
int sum=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(oil[i][j]=='@'){
dfs(i,j);
sum++;
}
}
}
cout<<sum<<endl;
}
}