定义一个二维数组:
它表示一个迷宫,其中的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写的,作为一个菜鸟,着实写了好久……
此题分为两部分:(求最短路径并输出其路径)
1.bfs
2.输出
输出的时候要从目标结点逆序输出到初始结点
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
const int INF=100000000;
typedef pair<int,int> P;
int maze[5][5];
int d[5][5];
P t[5][5];
int dx[4]={0,1,0,-1};
int dy[4]={-1,0,1,0};
int bfs(){
queue<P> que;
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
d[i][j]=INF;
}
}
que.push(P(0,0));
d[0][0]=0;
while(que.size()){
P p=que.front();que.pop();
if(p.first==4&&p.second==4)break;
for(int i=0;i<4;i++){
int nx=p.first+dx[i];
int ny=p.second+dy[i];
if(nx>=0&&nx<5&&ny>=0&&ny<5&&d[nx][ny]==INF&&maze[nx][ny]!=1){
que.push(P(nx,ny));
d[nx][ny]=d[p.first][p.second]+1;
t[nx][ny]=p;//记录点nx,ny的前一个点是p
}
}
}
return d[4][4];
}
void print_ans(P u){
vector<P> ans;
for(;;){
ans.push_back(u);
if(d[u.first][u.second]==0)break;
u=t[u.first][u.second];
}
for(int i=ans.size()-1;i>=0;i--){
printf("(%d, %d)\n",ans[i].first,ans[i].second);
}
}
int main(){
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
scanf("%d",&maze[i][j]);
}
}
bfs();
print_ans(P(4,4));
}