题面:
定义一个二维数组:
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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个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 0
Sample Output
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
上代码 :
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
#include<string.h>
typedef long long ll;
const int maxn = 10005;
int a[] = { 1,-1,0,0 };
int b[] = { 0,0,-1,1 };
int maze[5][5];
int vis[5][5];
typedef struct
{
int x, y;
}point;
point path[50];
int acount;
void bfs(int x,int y)
{
queue<point>s;
point t;
t.x = x;
t.y = y;
s.push(t);
vis[x][y] = 1;
while (!s.empty())
{
point p = s.front();
s.pop();
if (p.x == 4 && p.y == 4)
{
acount += vis[p.x][p.y];
return ;
}
for (int i = 0; i < 4; i++)
{
int xx = p.x + a[i];
int yy = p.y + b[i];
if (xx >= 0 && xx < 5 && yy >= 0 && yy < 5 && maze[xx][yy]!=1)
{
vis[xx][yy] = vis[p.x][p.y] + 1;
point p1;
p1.x = xx;
p1.y = yy;
s.push(p1);
maze[xx][yy] = 1;
}
}
}
}
int main()
{
int i, j;
for (i = 0; i < 5; i++)
for (j = 0; j < 5; j++)
cin >> maze[i][j];
maze[0][0] = 1;
bfs(0, 0);
point p2;
p2.x = 4, p2.y = 4;
for (i = acount - 1; i >= 0; i--)
{
path[i].x = p2.x;
path[i].y = p2.y;
for (j = 0; j < 4; j++)
{
int xx = p2.x + a[j];
int yy = p2.y + b[j];
if (xx > 4 || xx < 0 || yy < 0 || yy>4)
continue;
if (vis[xx][yy] == vis[p2.x][p2.y] - 1)
{
p2.x = xx;
p2.y = yy;
break;
}
}
}
for (i = 0; i < acount; i++)
{
cout << '(' << path[i].x << ',' << path[i].y << ')' << endl;
}
return 0;
}
是求最短的路径的题,初看,用BFS 只能 求最小的步数啊,于是看了看大神的操作 ,原来BFS 也可以来求 路径。大开眼界。
下面说说思路 , 首先 先求出最短的步数 是多少 ,然后再从结束点往回退去搜 连成串的1,2,3,4,5,6...... 这个就是最短路径。
看看图:
明显有个 1,2,3,4,5,6,7,8,9 只要找到 这个 线,就可以找到 路径了 。
代码怎么实现 :首先 要求的是 x,y 做标,肯定要 用到 结构体, 每次都在四个方向 都搜一下 ,看看 有没有连成一串的,如果是 ,那就进结构体数组,倒着装进数组中 。
p2.x = 4, p2.y = 4;
for (i = acount - 1; i >= 0; i--)
{
path[i].x = p2.x;
path[i].y = p2.y;
for (j = 0; j < 4; j++)
{
int xx = p2.x + a[j];
int yy = p2.y + b[j];
if (xx > 4 || xx < 0 || yy < 0 || yy>4)
continue;
if (vis[xx][yy] == vis[p2.x][p2.y] - 1)
{
p2.x = xx;
p2.y = yy;
break;
}
}
}
最后再 正着输出路径 。