POJ3984迷宫问题
目录
- POJ3984迷宫问题
- 题目描述
- 思路分析
- 代码
POJ3984迷宫问题
日常安利本题我的博客
题目描述
给出一个5×5的数字矩阵其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
思路分析
事实证明,bfs对这种数字矩阵的处理能力明显不如dfs,bfs对距离矩阵的处理更强。
之前对图的处理多是那种邻接矩阵的处理,但是对这种数字矩阵的处理要差很多,刚开始做法大体是知道,但是编程时却有点蒙,基础太差了。
首先,回忆一下bfs。bfs就是广度优先搜索,从起始点开始,将这个点相连的点加入到队列之中,标记经过的点,然后依次将队列中的点取出,然后加入与这个点相连的点(要并未访问过的),因为队列先进先出的规律,所以就可以分层次遍历途中所有点。这里值得注意的是,由于是从开始分层遍历,所以先经过的点一定是最优的。即如果某个点是最短路的必经之路,那么第一次访问它的前一个节点也一定是必经之路。通过这个特点,就可以在将点加入队列的时候,顺便记录一下他的父亲节点(即这个节点的上一个节点)。这样通过队最后一个节点开始递归,就可以找到最短路径了。
记录路径时,因为这个图只有上下左右四个方向,所以可以通过方向记录,空间上这么做更为优秀,但是为了之后处理距离矩阵的图,所以用struct数组存点的路径。另外我的代码并没有采用递归,而是使用差不多的栈结构。在路径比较长时,可以使用vector代替,但是本题不需要,我就懒着了吧_。
代码
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<string>
#include <stack>
#include<queue>
using namespace std ;#define mem(a) memset(a,0,sizeof(a))
#define ll long longconst double eps = 1e-8;
const int maxn = 110010;//须填写
const int inf = 0x3f3f3f3f;int dir[4][2]={0,-1, //up0,1, //down-1,0, //left1,0, //rights
};int vis[10][10];
int pic[10][10];
struct Node
{int x;int y;
};
Node way[10][10];void bfs(Node node)
{queue <Node> que;Node n;int x,y;que.push(node);vis[node.x][node.y]=1;way[node.x][node.y].x=-1;while(!que.empty()){n=que.front();que.pop();for(int i=0;i<4;i++){x=n.x+dir[i][0];y=n.y+dir[i][1];if(x>=0&&x<5&&y>=0&&y<5&&pic[x][y]==0&&vis[x][y]==0){way[x][y]=n;n.x=x;n.y=y;vis[x][y]=1;que.push(n);}}}
}int main()
{//freopen("in.txt", "r", stdin);for(int i=0;i<5;i++){for(int j=0;j<5;j++){scanf("%d",&pic[i][j]);}}Node node;stack<Node> s;node.x=0;node.y=0;bfs(node);node.x=4;node.y=4;while(node.x!=-1){s.push(node);node=way[node.x][node.y];}while(!s.empty()){node=s.top();printf("(%d, %d)\n",node.x,node.y);s.pop();}return 0;
}
POJ3984迷宫问题相关推荐
- poj3984 迷宫问题 bfs 最短路 广搜
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 27913 Accepted: 16091 Descriptio ...
- POJ3984 迷宫问题【BFS】
好长时间没有敲过代码了,感觉之前学过的都忘了,趁着这个暑假,打算把之前学习的东西都复习一下,当然得慢慢来,毕竟好长时间不敲代码了,怎么着都有些生疏,再加上之前学的也不咋地,相当于回炉重造吧,见笑见笑. ...
- CCF认证训练行动路线图
通过CCF认证的训练题选自三个方面,一是CCF认证试题,二是使用北大百练的练习题等等,三是ACM-ICPC的练习题. CCF认证的试题是必须练习的,通过CCF试题的练习有助于了解试题风格特点.然而CC ...
- TYUT-A专题题解(二)
TYUT-A专题题解(一) TYUT-A专题题解(二) 36暴力枚举 AOJ0008 Sum of 4 Integers[暴力]_海岛Blog-CSDN博客 HDU1407 测试你是否和LTC水平一样 ...
- 基础训练(六~十)题解
基础训练(六) HDU1248 寒冰王座[0/1背包+DP] - 海岛Blog - CSDN博客 HDU1287 破译密码[密码] - 海岛Blog - CSDN博客 HDU1408 盐水的故事[模拟 ...
- 《程序设计技术》课程辅助学习资料
本文档提供课程相关的辅助学习资料. 阅读程序是提高程序设计水平的最为有效的方法,<程序设计技术>课程至少应该阅读后面提供链接博文中的基础部分.能够阅读完基础部分的博文,则可以给课程学习奠定 ...
- 最短路算法详解(Dijkstra/SPFA/Floyd)
转自:http://blog.csdn.net/murmured/article/details/19281031 一.Dijkstra Dijkstra单源最短路算法,即计算从起点出发到每个点的最短 ...
- kuangbin 专题一 简单搜索
kuangbin 专题一 简单搜索 1.POJ1321棋盘问题[DFS] 代码 自己的想法 2.POJ2251Dungeon Master[三维空间BFS] 代码 自己的想法 3.POJ3278 Ca ...
- 算法之路——深搜、广搜(简单搜索)
搜索 通过一定的顺序,枚举每一个数据(经常会通过一些判断条件去掉无意义的数据,即剪枝),找到想要的数据的过程. 深度优先搜索(dfs) 深度优先搜索属于图算法的一种,是一个针对图和树的算法,应为缩写为 ...
最新文章
- [收集] Web服务相关的, 介绍框架(framework)类的论文
- html5 原生 弹窗,一起来看 HTML 5.2 中新的原生元素 dialog
- 重磅直播|光学3D测量技术原理及应用
- poj 2455 Secret Milking Machine(二分枚举+最大流)
- linux给oracle导入sql语句,Linux数据库创建与数据导入
- dubbo超时重试和异常处理
- 队列和消息队列_消息队列概述[幻灯片]
- 开发者论坛一周精粹(第四十七期)服务器变更已备案域名需要重新备案吗?
- 【毕业设计】jsp+sql毕业选题系统(论文)
- 明明是数字“1000”转换成整形时却报错---BOM 非法字符 /65279(FEFF) big endian(FEFF)和little endian(FFFE) 模式
- 内存之私有sql区和共享sql区
- 2021-08-08索引在小数据量的时候用处不大,但在大数据的时候十分明显
- docker java镜像_Docker容器引擎与架构
- Anaconda更新PIP
- HBuilderX 快捷键
- pbootcms模板忘记后台密码怎么办?
- php 语句以句号结尾,短句末尾是否用句号
- iptables中DNAT、SNAT和MASQUERADE
- Jenkins怎么发邮件,5年字节自动化大神手把手教你
- mysql触发器更新自己表_mysql 触发器更新自己表|单表操作 阿星小栈