Le chemin le plus court dans la version de recherche large (le chemin le plus court d'un point à un autre)

Étant donné une matrice N x M 01, où 1 représente la terre et 0 représente l'eau. Pour chaque emplacement, déterminez à quelle distance il se trouve du plan d'eau le plus proche.

La distance entre chaque position dans la matrice et la grille adjacente vers le haut, le bas, la gauche et la droite est de 1.

La
première ligne d' Entrée contient deux entiers, N et M.

Les N lignes suivantes ont M 0 ou 1 dans chaque ligne, représentant la carte.

Les données sont garanties d'avoir au moins 1 zone d'eau.

Pour 30% des données, 1 <= N, M <= 100

Pour des données à 100%, 1 <= N, M <= 800

Sortie de
sortie N lignes, chaque ligne de M entiers séparés par des espaces. Chaque entier représente la distance entre l'emplacement et la zone aquatique la plus proche.

Exemple d'entrée

4 4
0110
1111
1111
0110

Exemple de sortie

0 1 1 0
1 2 2 1
1 2 2 1
0 1 1 0

La signification de la question est facile à comprendre. Je n'en parlerai donc pas ici. Il s'agit d'une question de recherche large, mais la méthode de recherche doit être ajustée.

   最初思路:陆地搜水域,进行一个一个广搜,就超时了
            其实仔细一想,假如一张图就右下角是水域,其它的全是陆地,
            这样的广搜也是超级费时间的

接下来的思路:依然是广搜,但不一样的是只需把图搜一遍即可。
      方法是利用水域搜水,你可能觉得和上一个方法是一样的操作,其实是不一样的
 流程:
 把所有的水域放入队列中,然后利用每一个水域去寻找该水域四周的陆地,
 如果说该水域在一步的情况下没有找到陆地,那该水域就没有用处了,就可以被踢出队列了,
 为什么这么说呢,你想想看,该水域的四周也是水域,陆地要寻找水域肯定会先找到
 它四周的水域啊。
 如果找到了陆地,那可给该陆地赋值所用的步数,其它的陆地可用该陆地去寻找,为什么呢,
 因为该陆地最开始的地方是一条水域的,这就相当于一条水域后面接了一大串的陆地

Si c'est 4 * 4, il y a 4 zones d'eau et 12 zones terrestres, et une telle image peut apparaître.

Eau 1 -----------> Terre 4 --------> Terre 8 ----------> Terre 12 ---------- -> Atterrir 6
1 étape 2 étapes 3 étapes 4 étapes pour atteindre l'eau (4 terres)

Eaux 2 -----------> Terre 1 --------> Terre 3 ----------> Terre 5 ---------- -> Terrain 7 -------> Terrain 9 -----------> Terrain 11 -------> Terrain 2
1 étape 2 étape 3 étape 4 étape 5 étape 6 7 étapes pour atteindre l'eau (7 terres)

Zone d'eau 3 ---------> La zone d'eau
peut atteindre la zone d' eau en 10 étapes (1 terrain)

Eaux 4 Rien et
0 terre

C'est le chemin qui peut être formé en utilisant Guangsou

Code

#include<stdio.h>
#include<queue>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m;
char e[880][880];
int a[880][880];
int to[4][2]={
    
    {
    
    1,0},{
    
    -1,0},{
    
    0,1},{
    
    0,-1}};
struct Node{
    
    
	int x,y,s;
}u,v;
queue<Node> q;
void bfs()
{
    
    
	int i,tx,ty;
	while(!q.empty())
	{
    
    
		u=q.front();
		q.pop();
		for(i=0;i<4;i++)
		{
    
    
			tx=u.x+to[i][0];
			ty=u.y+to[i][1];
			if(tx<0||tx>=n||ty<0||ty>=m)
				continue;
			if(a[tx][ty]==-1)//进过队列的就不用再进了
			{
    
    
				v.x=tx;
				v.y=ty;
				v.s=u.s+1;
				a[tx][ty]=v.s;
				q.push(v);//每个水在一步之内可达到的陆地才能进队列,而且同一个陆地只能进队列一遍,水全部出列队了便可依靠队列中的陆地找陆地,因为每个陆地都会在源点有一个水 
			}
		}
	}
}
int main()
{
    
    
	while(~scanf("%d %d",&n,&m))
	{
    
    
		memset(a,-1,sizeof(a));
		int i,j;
		for(i=0;i<n;i++)
			scanf("%s",e[i]);
		for(i=0;i<n;i++)
		{
    
    
			for(j=0;j<m;j++)
			{
    
    
				if(e[i][j]=='0')
				{
    
    
					a[i][j]=0;
					u.x=i;
					u.y=j;
					u.s=0;
					q.push(u);//所有的水都进队列 
				}
			}
		}
		bfs();
		for(i=0;i<n;i++)
		{
    
    
			for(j=0;j<m;j++)
			{
    
    
				if(j==0)
					printf("%d",a[i][j]);
				else
					printf(" %d",a[i][j]);
			}
			printf("\n");
		}
	}
	return 0;
}

Je suppose que tu aimes

Origine blog.csdn.net/Helinshan/article/details/108949643
conseillé
Classement