宝岛探险问题(dfs或递归求解)

若海域由一个主岛和一些附属岛屿组成,海域可由一个n×n的方阵表示,矩阵中的数字表示相应主岛或岛屿的海拔:数字1~9表示陆地,数字0表示海洋。 
现在程序猿儿打算在某个岛屿或主岛上探险,他的飞机将会降落在海域坐标为(x, y)的陆地上,请你计算猿儿降落点所在岛屿或主岛的面积有多大

input
4 4 2 3
1 2 1 0
0 1 1 0
0 1 0 0
0 0 1 0

output
6

法1思路:显然这是一个搜索算法,即只要从当前坐标点开始遍历,每遍历到一个点进行计数即可
 

#include<iostream>
using namespace std;
int a[110][110];
int next[4][2]={
   
   {0,1},{0,-1},{1,0},{-1,0}};   //方向数组 
int visit[110][110];//标记数组  标记是否走过 
int sum;  //记录面积大小 
int m,n; //m行 n列 
void dfs(int x,int y)
{
	int tx,ty;
	for(int i=0;i<4;i++)
	{
		tx=x+next[i][0];
		ty=y+next[i][1];
		if(tx<1||tx>n||ty<1||ty>m)  //超出边界则回退 
		continue;
		if(a[tx][ty]>0&&visit[tx][ty]==0) //当前未走过 
		{
			sum++;
			
			visit[tx][ty]=1;
			dfs(tx,ty) ;    
			//visit[tx][ty]=0; //不需要回溯 ?? 
		}
		
	}
}



int  main(void)
{
	int i,j,startx,starty;
	cin>>m>>n>>startx>>starty;
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			cin>>a[i][j];
	visit[startx][starty]=1;
	sum=1;
	dfs(startx,starty);
	cout<<sum;
	
	return 0;		
}

法2思路: 用递归

首先如何用递归去完成DFS呢?思路是这样的,首先找到目标点,然后从目标点发散开来。

怎么发散?那就要有一个方向。没错,那我们需要实现方向,怎么实现?数组增减1咯,在后面的样例中我们用一个数组来表示方向。

然后当我们到达新的方向之后怎么办?继续DFS,没错。怎么实现?那就是递归咯。

等等,每次到达新的地方都要DFS么?当然不是,如果那个值是你要找的,那你就继续扩散,如果不是你要找的,那就不扩散啊。怎么实现?加一条if语句咯。

再等等,你是不是没有考虑数组越界?没错,那我们还需要一些判断语句,保证我们的数组是不越界的。


int dfs1(int x,int y)  //法2  直接用递归 
{
		if(x<1||x>n||y<1||y>m)
		return 0;
		if(visit[x][y]!=0||a[x][y]==0)
		return 0;
		
		visit[x][y]=1;
		return 1+dfs1(x+1,y)+dfs1(x-1,y)+dfs1(x,y+1)+dfs1(x,y-1); //表示四个方向
		
	
 } 



 

猜你喜欢

转载自blog.csdn.net/a447332241/article/details/87738621