定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, };
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0Sample Output
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
//BFS广搜然后在找到路径后根据Pre往前递归到-1, 然后输出, 熟悉队列原理即可
#include <iostream>
#include <cmath>
#include <string.h>
#include <algorithm>
#include <iomanip>
#include <set>
#include <vector>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <deque>
using namespace std;
#define PI 3.1415926
#define INF 0x7fffffff
#define maxn 5
struct node
{
int x, y;
int Pre;
}q[1000];
int cnt;
int Dx[4] = {0, 1, 0, -1};
int Dy[4] = {1, 0, -1, 0};
int T, n, m, step;
int MAP[maxn][maxn];
bool book[maxn][maxn];
void Init();
void BFS(int x, int y);
void Print(int front)
{
if(q[front].Pre == -1)
return ;
Print(q[front].Pre);
cout << "(" << q[front].x << ", " << q[front].y <<")" << endl;
}
int main()
{
std::ios::sync_with_stdio(false);
n = 5;
Init();
memset(book, 0, sizeof(book));
cout << "(0, 0)" << endl;
BFS(0, 0);
cout << "(4, 4)" << endl;
return 0;
}
void Init()
{
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 5; j++)
{
cin >> MAP[i][j];
}
}
}
void BFS(int x, int y)
{
book[0][0] = 1;
q[0].x = x;
q[0].y = y;
q[0].Pre = -1;
int front = 0, rear = 1;
while(front < rear)
{
for(int i = 0; i < 4; i++)
{
int dx = q[front].x + Dx[i];
int dy = q[front].y + Dy[i];
if(dx < 0 || dx > 4 || dy < 0 || dy > 4)
continue;
else if(book[dx][dy] == 0 && MAP[dx][dy] == 0)
{
book[dx][dy] = 1;
q[rear].x = dx;
q[rear].y = dy;
q[rear].Pre = front;
rear++;
cnt = rear;
}
if(dx == 4 && dy == 4)
{
Print(front);
return;
}
}
front++;
}
return;
}