[La pensée et de la pratique de programmation travail Semaine2 A Maze]

Signification des questions:

Il y a une carte, la carte dans le coin supérieur gauche est l'entrée, le coin inférieur droit à l'exportation. Carte, 1 ne peut pas marcher, 0 peut aller. Pour veiller à ce que l'importation, l'exportation zéro. Ecrire un programme pour trouver l'entrée de la sortie de la route la plus courte.

entrée:

Entrée est un 5 × 5 matrice à deux dimensions, à seulement deux nombres 0,1, positions de représentation sur la figure.
L'entrée de l'échantillon:
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

sortie:

Une pluralité de lignes de sortie, représente le chemin le plus court à partir supérieure gauche pour abaisser les coordonnées d'angle droit est transmis de manière séquentielle. Assurer que les données a une solution unique.
L'échantillon de la sortie:
(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)

idées:

La carte est initialisée à un tableau de 5 * 5, avec une carte montrant les obstacles, avec 0 carte pour atteindre le lieu, mais n'a pas encore arrivé. De la recherche en largeur début (BFS), a été utilisé depuis le numéro 0, donc l'utilisation de numérique> 2 marque la longueur du chemin (premier marqueur 2, le point de départ peut être atteint autour d'un point Labellisé 3, cette et ainsi de suite), la recherche arrête la sortie rencontrée. Enfin, selon la sortie de l'enregistrement des sentiers balisés (chacun cherchant à enregistrer une petite longueur de chemin que le point courant d'un point) jusqu'à ce que vous revenez au point de départ, trouver le chemin le plus court.

code:

#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;
}
Publié 25 articles originaux · éloge de won 8 · vues 549

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44034698/article/details/104562755
conseillé
Classement