poj 3984
来源:互联网 发布:路由器端口转发设置 编辑:程序博客网 时间:2024/06/03 15:46
题目大意:
定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
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;}
阅读全文
0 0
- 【POJ】:POJ 3984
- poj 3984
- poj 3984
- POJ 3984
- POJ 3984
- poj 3984
- poj 3984
- POJ 3984
- poj 3984
- poj 3984
- poj 3984
- poj 3984
- poj 3984
- POJ - 3984
- poj 3984
- poj 3984
- POJ 3984
- poj 3984
- 操作系统安装过程
- opencv如何查看函数源代码?
- java语言基础(95)——线程组的使用
- zumy_mbed无法编译解决办法
- JDK-9的安装与环境变量配置
- poj 3984
- Git报错Unlink of file 'readme.txt' failed. Should I try again? (y/n)
- 读《富爸爸,穷爸爸》
- 【图像特征提取1】方向梯度直方图HOG---从理论到实践------附带积分图像的解析
- 前端知识整理之CSS盒模型
- C语言程序设计17通信 第一章作业
- C语言 归并排序
- 23. Merge k Sorted Lists
- 在Ubuntu下利用anaconda安装pytorch