题目连接:http://poj.org/problem?id=3984
题解:简单的BFS+记录路径,具体题解看代码注释。
#include <iostream> #include <queue> #include <cstdio> using namespace std; struct point { int x; int y; }; queue<point>q; int map[5][5]; int vis[5][5];//标记走过的路 int g[4][2]={0,1,0,-1,1,0,-1,0};//四个方向 int lx[5][5],ly[5][5];//记录到达这个点的前一个点 void bfs() { point p; p.x=0; p.y=0; q.push(p); while(!q.empty()) { p=q.front(); q.pop(); if(p.x==4 && p.y==4) return; for(int i=0;i<4;i++) { int x=p.x+g[i][0]; int y=p.y+g[i][1]; if(x<0 || x>4 || y<0 || y>4 || vis[x][y] || map[x][y]) continue; point temp; temp.x=x; temp.y=y; q.push(temp); vis[x][y]=1; //对走过的路进行标记 lx[x][y]=p.x; //记录到达这个点的前一个点的x坐标 ly[x][y]=p.y; //记录到达这个点的前一个点的y坐标 } } } void cout_way(int x,int y)//递归输出 { if(x||y) cout_way(lx[x][y],ly[x][y]); printf("(%d, %d)\n",x,y); } int main() { for(int i=0;i<5;i++) for(int j=0;j<5;j++) cin>>map[i][j]; bfs(); cout_way(4,4); /*for(int i=0;i<5;i++)//每一个状态之前的状态 { for(int j=0;j<5;j++) printf("(%d,%d) \n",lx[i][j],ly[i][j]); cout<<endl; }*/ return 0; }
时间: 2024-11-29 09:20:40