Problema de exploración de Treasure Island (dfs o solución recursiva)

Si el área del mar está compuesta por una isla principal y algunas islas subsidiarias, el área del mar se puede representar mediante una matriz cuadrada de n × n. Los números en la matriz representan la elevación de la isla o isla principal correspondiente: los números 1-9 representan la tierra, y el número 0 representa el océano. 
Ahora el programa Yuaner tiene la intención de explorar en una determinada isla o la isla principal, y su avión aterrizará en la tierra con coordenadas (x, y) en el área del mar. Por favor, calcule el tamaño de la isla o isla principal donde aterrizó Yuaner el punto es

entrada
4 4 2 3
1 2 1 0
0 1 1 0
0 1 0 0
0 0 1 0

salida
6

Método 1: Obviamente, este es un algoritmo de búsqueda, es decir, siempre que el recorrido comience desde el punto de coordenadas actual y cuente cada vez que se recorre un punto.
 

#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;		
}

Método 2: usar la recursividad

Primero, ¿cómo usar la recursividad para completar DFS? La idea es esta, primero encuentre el punto de destino y luego diverja del punto de destino.

¿Cómo divergir? Entonces debe haber una dirección. Sí, entonces necesitamos darnos cuenta de la dirección, ¿cómo realizarla? La matriz aumenta o disminuye en 1. En el siguiente ejemplo, usamos una matriz para indicar la dirección.

Entonces, ¿qué debemos hacer cuando alcancemos la nueva dirección? Continúe DFS, sí. ¿Cómo lograrlo? Eso es recursividad.

Espera, ¿necesito DFS cada vez que llego a un lugar nuevo? Por supuesto que no. Si el valor es lo que está buscando, entonces continuará extendiéndose, si no es lo que está buscando, entonces no se extenderá. ¿Cómo lograrlo? Agregue una declaración if.

Espere un minuto, ¿no consideró que la matriz estaba fuera de límites? Así es, entonces todavía necesitamos algunas declaraciones de juicio para asegurarnos de que nuestra matriz no cruce el límite.

 


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); //表示四个方向
		
	
 } 



 

Supongo que te gusta

Origin blog.csdn.net/a447332241/article/details/87738621
Recomendado
Clasificación