[Pensamiento y la práctica de programación de trabajos Semana2 Un Laberinto]

Significado de las preguntas:

Hay un mapa, el mapa en la esquina superior izquierda está la entrada, la esquina inferior derecha para la exportación. Mapa, no puede caminar 1, 0 puede ir. Para asegurar que el cero de importación, de exportación. Escribir un programa para encontrar la entrada a la salida de la ruta más corta.

entrada:

De entrada es una matriz de 5 x 5 en dos dimensiones, a sólo los dos números 0,1, las posiciones de representación en la figura.
La entrada de la muestra:
0. 1 0 0 0
0 0. 1. 1 0
0 0. 1. 1 0
0 0 0. 1 0
0 0. 1. 1 0

salida:

Una pluralidad de líneas de salida, representa el camino más corto desde la parte superior izquierda para bajar las coordenadas de la esquina derecha pasa secuencialmente. Garantizar que los datos tiene una solución única.
La muestra de la salida:
(0, 0)
(1, 0).
(2, 0)
(3, 0).
(3 ,. 1.)
(3, 2).
(2, 2)
(1, 2).
(0, 2)
(0 , 3)
(0, 4)
(1, 4)
(2, 4)
(3, 4)
(4, 4)

ideas:

El mapa se inicializa a una matriz de 5 x 5, con un mapa que muestra los obstáculos, con 0 mapa para llegar al lugar, pero aún no ha llegado. Desde el primero en amplitud de búsqueda (el BFS) inicio, se ha utilizado desde el número 0, por lo que el uso de la tecnología digital> 2 que marca la longitud de la trayectoria (es decir, iniciar la etiqueta 2, el punto de partida puede ser alcanzado alrededor de un punto etiquetado 3, este y así sucesivamente), la búsqueda se detiene la salida encontrado. Por último, de acuerdo con la salida de las rutas de registro marcado (cada uno mirando para grabar una pequeña longitud de la trayectoria que el punto actual de un punto) hasta que vuelva al punto de partida, encontrar el camino más corto.

código:

#include <iostream>
#include<stdio.h>
#include<queue>
#include<vector>
using namespace std;
const int maxn=5;
int vis[maxn][maxn];
int dx[]={1,-1,0,0},
	dy[]={0,0,1,-1};
int sx=0,sy=0,tx=4,ty=4;
struct Point{
	int x;
	int y;
	Point(int thex,int they)
	{
		x=thex,y=they;
	}
	
};
queue<Point> q;
void bfs()
{
	q.push(Point(sx,sy));
	vis[sx][sy]=2;
	while(!q.empty())
	{
		Point now=q.front();
		q.pop();
		for(int i=0;i<4;i++)
		{
			int x=now.x+dx[i];
			int y=now.y+dy[i];
			if(x>=0&&x<maxn&&y>=0&&y<maxn&&vis[x][y]==0)
			{
				vis[x][y]=vis[now.x][now.y]+1;
				q.push(Point(x,y));
				if(x==tx&&y==ty)
					return;
			}
		}
	}
}
void print()
{
	vector<Point> v;
	Point now(tx,ty);
	v.push_back(Point(tx,ty));
	while(true)
	{
		if(now.x==sx&&now.y==sy)
		{
			//printf("(%d,%d)\n",sx,sy);
			break;
		}
		for(int i=0;i<4;i++)
		{
			int x=now.x+dx[i],y=now.y+dy[i];
			if(x>=0&&x<maxn&&y>=0&&y<maxn&&vis[x][y]==vis[now.x][now.y]-1)
			{
				v.push_back(Point(x,y));
				now.x=x,now.y=y;
				break;
			}
		}
	}
	vector<Point>::reverse_iterator it=v.rbegin();
	printf("(%d, %d)",it->x,it->y);
	it++;
	for(;it!=v.rend();it++)
		printf("\n(%d, %d)",it->x,it->y);
}
int main(int argc, char** argv) {
	for(int i=0;i<maxn;i++)
		for(int j=0;j<maxn;j++)
			cin>>vis[i][j];
	bfs();
	print();
	return 0;
}
Publicado 25 artículos originales · ganado elogios 8 · visitas 549

Supongo que te gusta

Origin blog.csdn.net/weixin_44034698/article/details/104562755
Recomendado
Clasificación