题目:
定义一个二维数组:
它表示一个迷宫,其中的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的练习。用BFS算出最短路径后再倒序遍历一遍。嘛,第一次学习bfs用的过程比较繁琐。这题目最后的格式问题害我wa了三次,生气。
代码:
#include<iostream>
#include<cstdio>
#include<utility>
#include<queue>
#include<stack>
using namespace std;
const int INF=100000000;
typedef pair<int,int> P;
int main()
{
queue<P> que;
int a[5][5];
int i,j;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
scanf("%d",&a[i][j]);
}
}
int sx=0,sy=0;
int gx=4,gy=4;
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int d[100][100];
int b[5][5]={0};
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
d[i][j]=INF;
}
}
que.push(P(sx,sy));
d[sx][sy]=0;
int y;
while(que.size())
{
P p=que.front();
que.pop();
if(p.first==gx&&p.second==gy)break;
for(int i=0;i<4;i++)
{
int nx=p.first+dx[i],ny=p.second+dy[i];
if(0<=nx&&nx<5&&0<=ny&&ny<5&&a[nx][ny]!=1&&d[nx][ny]==INF)
{
que.push(P(nx,ny));
b[nx][ny]=b[p.first][p.second]+1;
d[nx][ny]=d[p.first][p.second]+1;
}
}
y=d[gx][gy];
}
stack<P> st;
stack<P> q;
st.push(P(4,4));
while(st.size())
{
P p=st.top();
q.push(st.top());
st.pop();
if(p.first==sx&&p.second==sy)break;
for(int i=0;i<4;i++)
{
int nx=p.first+dx[i],ny=p.second+dy[i];
if(0<=nx&&nx<5&&0<=ny&&ny<5&&b[nx][ny]==y-1)
{
y=y-1;
st.push(P(nx,ny));
}
}
}
q.pop();
cout<<"("<<0<<", "<<0<<")";
while(!q.empty())
{
P p=q.top();
cout<<endl<<"("<<p.first<<", "<<p.second<<")";
q.pop();
}
return 0;
}