最基本的bfs,只是要输出最短路径经过哪些点,网上的高端代码看不懂,只好弱弱的用STL上了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include <stack>
using namespace std;
int Map[5][5];
int Ans[5][5];
bool flag[5][5];
int way[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
typedef pair<int ,int> P;
queue <P> q;
vector <P> v[60]; //保存当前点的前驱
stack <P> s; //保存路径
void bfs(){
while(!q.empty()){
P p=q.front();
q.pop();
if(p.first==4&&p.second==4){
break;
}
for(int i=0;i<4;i++){
int dx=p.first+way[i][0];
int dy=p.second+way[i][1];
if(dx>=0&&dx<=4&&dy>=0&&dy<=4&&Map[dx][dy]==0&&!flag[dx][dy]){
q.push(P(dx,dy));
flag[dx][dy]=true;
Ans[dx][dy]=Ans[p.first][p.second]+1;
v[dx*10+dy].push_back(P(p.first,p.second));
}
}
}
}
int main(){
for(int i=0;i<60;i++){
v[i].clear();
}
memset(flag,false,sizeof(flag));
memset(Ans,0,sizeof(Ans));
for(int i=0;i<=4;i++){
for(int j=0;j<=4;j++){
scanf("%d",&Map[i][j]);
}
}
q.push(P(0,0));
bfs();
int x=4,y=4;
while(1){
s.push(P(x,y));
if(x==0&&y==0)
break;
int tmp=x;
x=v[x*10+y][0].first;
y=v[tmp*10+y][0].second;
}
while(!s.empty()){
printf("(%d, %d)\n",s.top().first,s.top().second);
s.pop();
}
while(!q.empty()){
q.pop();
}
return 0;
}