oil deposite

我觉得代码真的是越写理解越透彻,所以继续刷题吧。

https://vjudge.net/problem/HDU-1241

呐,传送门!
这个题可以称之为,深度搜索的一个最基础的例子

#include
#include
#include
#include
#include 
using namespace std;
bool visited[100][100];
char s[100][100];	
int n,m;
int sum=0;
void dfs(int i,int j)
{
	if(s[i][j]!='@')
	return ; 
if(s[i][j]=='@')
{
	//s[i][j]='!';
	//visited[i][j]=true;
	s[i][j]='k';
     	dfs(i+1,j);
     	dfs(i,j+1);
     	dfs(i-1,j);
     	dfs(i,j-1);
     	dfs(i+1,j+1);
     	dfs(i+1,j-1);
     	dfs(i-1,j+1);
     	dfs(i-1,j-1);
}	

}
int main()
{

	while(cin>>n>>m)
	{
		sum=0;
		if(n==0&&m==0)
		return 0;
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++)
			cin>>s[i][j];
		}
		
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		if(s[i][j]=='@')
		{
			dfs(i,j);
			sum++;
		}
	 } 
		cout<<sum<<endl;
	}
} 

只需要不断地不断地搜索就可以了
另外需要注意的是,如果一个点搜到了,就不需要再搜索了,就可以把他换成其他的字母,避免以后继续进行搜索。
同时,我刚开始时,利用了visite数组,对其进行了标记·,但是我发现,这样会重复导致失败,改字母和数组标记两者选其一吧。

你可能感兴趣的:(acm)