Problema de exploração da Ilha do Tesouro (dfs ou solução recursiva)

Se a área do mar for composta por uma ilha principal e algumas ilhas subsidiárias, a área do mar pode ser representada por uma matriz quadrada n × n. Os números na matriz representam a elevação da ilha ou ilha principal correspondente: os números 1-9 representam a terra, e o número 0 representa o oceano. 
Agora o programa Yuaner pretende explorar em uma determinada ilha ou ilha principal, e seu avião pousará na terra com as coordenadas (x, y) na área do mar. Calcule o tamanho da ilha ou ilha principal onde o Yuaner pousou o ponto é

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

saída
6

Método 1: Obviamente, este é um algoritmo de busca, ou seja, desde que o percurso comece a partir do ponto de coordenada atual e conte cada vez que um ponto é percorrido
 

#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 recursão

Primeiro, como usar a recursão para concluir o DFS? A ideia é esta, primeiro encontre o ponto-alvo e depois divirta-se do ponto-alvo.

Como divergir? Então deve haver uma direção. Sim, então precisamos perceber a direção, como percebê-la? A matriz aumenta ou diminui em 1. No exemplo a seguir, usamos uma matriz para indicar a direção.

Então o que devemos fazer quando alcançarmos a nova direção? Continue DFS, sim. Como conseguir isso? Isso é recursão.

Espere, eu preciso do DFS toda vez que chegar a um novo lugar? Claro que não. Se o valor for o que você está procurando, você continuará a se espalhar, se não for o que você está procurando, ele não se espalhará. Como conseguir isso? Adicione uma declaração if.

Espere um minuto, você não considerou a matriz fora dos limites? Isso mesmo, então ainda precisamos de algumas declarações de julgamento para garantir que nossa matriz não ultrapasse a fronteira.

 


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



 

Acho que você gosta

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