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