poj 3984

来源:互联网 发布:路由器端口转发设置 编辑:程序博客网 时间:2024/06/03 15:46

题目大意:

定义一个二维数组:
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的二维数组,表示一个迷宫。数据保证有唯一解。

输出:左上角到右下角的最短路径,格式如测试用例所示。


测试用例:
输入:0 1 0 0 00 1 0 1 00 0 0 0 00 1 1 1 00 0 0 1 00 0 0 0 00 1 1 1 00 1 0 0 00 1 1 1 00 0 0 1 00 0 0 0 00 1 1 1 00 1 0 0 00 0 1 0 11 0 0 0 00 0 0 0 00 1 1 1 01 0 0 0 01 0 1 0 11 0 0 0 0输出:(0, 0)(1, 0)(2, 0)(2, 1)(2, 2)(2, 3)(2, 4)(3, 4)(4, 4)(0, 0)(0, 1)(0, 2)(0, 3)(0, 4)(1, 4)(2, 4)(3, 4)(4, 4)(0, 0)(1, 0)(2, 0)(3, 0)(3, 1)(4, 1)(4, 2)(4, 3)(4, 4)(0, 0)(0, 1)(0, 2)(0, 3)(0, 4)(1, 4)(2, 4)(2, 3)(3, 3)(4, 3)(4, 4)算法描述:广度优先搜索+记录路径。
广度优先搜索:1:首先将(0,0)点加入队列。             2:取队首节点,然后将它符合“某种条件”的全部的子节点加入队列,pop队首节点。             3:是否找到(4,4),如否,则再次取队首节点......(回到第二步);如是,结束。“某种条件”:1:墙壁和路按题意标记为1和0。那么,走过的路标记为-1吧,标记为1也可以,只要不是0。             2:不要出界!
 记录路径:  step_x(xi+1,yi+1)=xi;            step_y(xi+1,yi+1)=yi;            待输出时,从step_x(4,4)、step_y(4,4)“反推”至起点即可知最短路径

代码实现:
#include "iostream"#include "queue"#include "stack"#define N 5using namespace std;int a[N][N],stepx[N][N],stepy[N][N];    //a是棋盘,stepx和stepy记录当前节点的前驱的坐标。int O[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//当前节点的移动方向。void BFS(){    queue<int> qx,qy;    int x=0,y=0;    qx.push(x);qy.push(y);    a[x][y]=-1;    while(!(x==4&&y==4))    {        x=qx.front();qx.pop();        y=qy.front();qy.pop();        for(int i=0;i<4;i++)        {            if(0<=x+O[i][0]&&x+O[i][0]<N&&0<=y+O[i][1]&&y+O[i][1]<N            &&a[x+O[i][0]][y+O[i][1]]==0)       //在棋盘内移动、不撞墙且不走重复的路。            {                qx.push(x+O[i][0]);                qy.push(y+O[i][1]);                a[x+O[i][0]][y+O[i][1]]=-1;     //走过的路标记为-1。                stepx[x+O[i][0]][y+O[i][1]]=x;  //记录当前节点的前驱的坐标。                stepy[x+O[i][0]][y+O[i][1]]=y;            }        }    }    return;}int main(){    for(int i=0;i<N;i++)        for(int j=0;j<N;j++)            cin>>a[i][j];   //输入。    BFS();                  //广度优先搜索寻路函数。    stack<int> sx,sy;       //输出部分。    int x=N-1,y=N-1,fzx,fzy;    sx.push(x);sy.push(y);    while(x+y)              //从终点回到起点(反向)将路径输入到栈中。    {        sx.push(stepx[x][y]);sy.push(stepy[x][y]);        fzx=stepx[x][y];    //交换x,y时要用到辅助的变量,否则像本人debug了半小时!!        fzy=stepy[x][y];    //x=stepx[x][y]; 非常低级的错误!!        x=fzx;y=fzy;        //y=stepy[x][y]; 错误的示范,因为在上一行x已经被改变了!    }    while(!sx.empty())      //用栈将路径正向输出。    {        cout<<"("<<sx.top()<<", "<<sy.top()<<")"<<endl;        sx.pop();sy.pop();    }    return 0;}
原创粉丝点击