BFS- BFS (primero en amplitud de búsqueda)

No importa qué tan alto de la montaña, escalar, subir siempre,
el camino puede ser largo, seguir adelante, será capaz de alcanzar.

BFS- BFS (primero en amplitud de búsqueda)

Aquí Insertar imagen Descripción
En primer lugar, vamos a ser específica Visualizar fotos entender lo que es la búsqueda en amplitud. Al considerar la condición distancia Huffman, encontrar la solución más corto llegar a un cierto punto se puede iniciar con ellos mismos como el radio central de la consulta. Esta es la BFS.
La figura GIF a continuación, un código para la visualización de un diagrama lógico de
Aquí Insertar imagen Descripción
la lógica global como se muestra arriba, necesitamos una determinación de matriz, para almacenar un (receptor), para almacenar una tarea.
Somos el primer elemento en la cola comenzó a caminar, no puede pasar por todos marcados 1 ya no ir, el resto de la expansión de un único depósito, si se alcanza el destino final, a continuación, al final de las BFS
estadounidenses es necesario seleccionar la cola debido a que las colas son FIFO, a fin de garantizar un cierto orden de.
Podemos dibujar el siguiente código

#include<unordered_map>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<utility>
#include<stdio.h>
#include<vector>
#include<string>
#include<math.h>
#include<cmath>
#include<queue>
#include<stack>
#include<deque>
#include<map>
#pragma warning(disable:4244)
#define PI 3.1415926536
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll ll_inf = 9223372036854775807;
const int int_inf = 2147483647;
const short short_inf = 32767;
const char char_inf = 127;
inline ll read() {
	ll c = getchar(), Nig = 1, x = 0;
	while (!isdigit(c) && c != '-')c = getchar();
	if (c == '-')Nig = -1, c = getchar();
	while (isdigit(c))x = ((x << 1) + (x << 3)) + (c ^ '0'), c = getchar();
	return Nig * x;
}
inline void out(ll a)
{
	if (a < 0)putchar('-'), a = -a;
	if (a >= 10)out(a / 10);
	putchar(a % 10 + '0');
}
ll qpow(ll x, ll n, ll mod) {
	ll res = 1;
	while (n > 0) {
		if (n & 1)res = (res * x) % mod;
		x = (x * x) % mod; n >>= 1;
	}
	return res;
}
#define read read()
int  n, m;
struct node {
	int x, y, step;
};
node temp;
bool judge[1000][1000];//判断数组,判断是否已经走过,或者是否可走
queue<node>q;
int dx[] = { 0,0,1,-1 };//简便行走上下左右
int dy[] = { 1,-1,0,0 };
void bfs()
{
	while (1)//一直走,知道无解或者有答案为止
	{
		if (q.empty())//如果已经走完全部的队列都没有结果就说明无解
		{
			cout << -1 << endl;
			return;
		}
		temp = q.front();//取任务
		q.pop();//删除任务
		judge[temp.x][temp.y] = 1;//该点已走过
		for (int i = 0; i < 4; i++)//四个方向都加队列
			if (!judge[temp.x + dx[i]][temp.y + dy[i]])//如果没有走过,可行就加
			{
				if (temp.x + dx[i] == n && temp.y + dy[i] == m)//如果当前走到了终点,就输出答案
				{
					cout << temp.step + 1 << endl;
					return;
				}
				q.push({ temp.x + dx[i], temp.y + dy[i], temp.step + 1 });//不是终点就入队列
			}
	}
}
int main()
{
	n = read, m = read;
	for (int i = 0; i <= n + 1; i++)judge[i][0] = judge[i][m + 1] = 1;//围墙
	for (int i = 0; i <= m + 1; i++)judge[0][i] = judge[n + 1][i] = 1;//围墙
	for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)judge[i][j] = read;//接收数据
	q.push({ 1,1,1 });//入队列第一个元素
	bfs();
}

Subproducto de la rueda mes

Publicado 32 artículos originales · ganado elogios 8 · vistas 1168

Supongo que te gusta

Origin blog.csdn.net/qq_35339563/article/details/105027590
Recomendado
Clasificación