改自
http://blog.csdn.net/youhebke52011/article/details/50300529
ac代码如下在原博主的代码上改了改顺序加了加注释方便自己理解,,
#include<cstdio> #include<queue> #include<iostream> using namespace std; struct Node{ //声明结点 int x,y; int step; }pre[501][501]; //pre结构体数组保留前驱结点,即保留路径 int ans = 0; //表示结果数 int a[501][501]; //有待输入的地图 int v[501][501]={0}; //记录访问的次数 int n,m; int dir[4][2] = {{1,0},{0,-1},{0,1},{-1,0}};//四个方向直接按照字典序搜索 及 d l r u bool check(int x,int y) //检查是否越界 { if(x<1 || x>n || y<1 || y>m || a[x][y] || v[x][y]) return false; return true; } void bfs(int bx,int by) //广度优先搜索 { queue<Node> Q; //声明队列 Node p; Node next; p.x = bx; p.y = by; p.step = 0; v[bx][by] = 1; Q.push(p); //放入初始化好的队列 while(!Q.empty()){ p = Q.front(); //取对首元素进行操作 for(int i=0;i<4;i++){ //循环遍历 next = p; next.x += dir[i][0]; next.y += dir[i][1]; next.step += 1; if(check(next.x ,next.y)){ Q.push(next); pre[next.x][next.y].x = p.x; pre[next.x][next.y].y = p.y; v[next.x][next.y] = 1; } if(next.x == n && next.y == m){ ans = next.step; pre[next.x][next.y].x = p.x; pre[next.x][next.y].y = p.y; return ; } } Q.pop(); //弹出对首元素 } ans = -1; //找不到队列的话输出保留ans的值为-1 } void print_road(int x,int y) { if(pre[x][y].x == -1) return ; print_road(pre[x][y].x,pre[x][y].y); //printf("%d %d %d %d\n",x,y,pre[x][y].x,pre[x][y].y); if(x == pre[x][y].x && y > pre[x][y].y) printf("R"); else if(x > pre[x][y].x && y == pre[x][y].y) printf("D"); else if(x < pre[x][y].x && y == pre[x][y].y) printf("U"); else if(x == pre[x][y].x && y < pre[x][y].y) printf("L"); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%1d",&a[i][j]); //输入技巧每次只输入一个数字 pre[1][1].x = pre[1][1].y = -1; bfs(1,1); printf("%d\n",ans); print_road(n,m); return 0; }