POJ 3984 迷宫问题 BFS DFS两种解法
题目地址:点这里
迷宫问题
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 18495 Accepted: 10947
Description
定义一个二维数组:
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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
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
Sample Output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
解题思路:首先 面对迷宫问题还是先想到bfs,尤其是在做了POJ 2251之后,更是觉得很容易了,(2251的题解点这里)稍有不同的是,这道题需要输出路径,我的想法是每走一步就记录下走到这一步的路径,所以终点的路径可以直接输出结点的path
AC代码:
#include<iostream>
#include<queue>
#include<algorithm>using namespace std;int a[5][5];
int dirx[4] = {1,-1,0,0};
int diry[4] = {0,0,1,-1};struct node
{int x;int y;int len;//走到该位置共需几步int path[25][2];//走到该位置的路径
}res;void bfs()
{queue<node> Q;node fir,u,v;fir.x=0;fir.y=0;fir.len=0;Q.push(fir);while(!Q.empty()){u=Q.front();Q.pop();for(int i=0;i<4;i++){v.x = u.x + dirx[i];v.y = u.y + diry[i];if(v.x<0||v.x>4||v.y<0||v.y>4)continue;if(a[v.x][v.y]==0){a[v.x][v.y]=1;//若可以走,加上这一步的路径,然后入队v.path[u.len][0]=u.x; v.path[u.len][1]=u.y; v.len=u.len+1;Q.push(v);if(v.x==4&&v.y==4){v.path[v.len][0]=v.x; v.path[v.len][1]=v.y; v.len=v.len+1;res=v;return;}}}}
}
int main()
{for(int i=0;i<5;i++)for(int j=0;j<5;j++)cin>>a[i][j];bfs();for(int i=0;i<res.len;i++)cout<<"("<<res.path[i][0]<<", "<<res.path[i][1]<<")"<<endl;return 0;
}
然而,在网上看到在一片BFS题解中有个DFS,于是自己试着做了一下,嗯对AC了,因为题目限制很大,只有5*5,所以也可以搜索出所有到终点的路径,找出最短的一条即可
AC代码:
#include<iostream>
#include<algorithm>using namespace std;int a[5][5];
int dirx[4] = {1,-1,0,0};
int diry[4] = {0,0,1,-1};struct node{int x;int y;
}path[25],way[25];//way存储最终结果,path存储当前路径
int ans=999999;//当前最短长度void dfs(node cur,int deep)
{if(cur.x==4&&cur.y==4&&ans>deep){ans=deep;for(int i=0;i<deep;i++){way[i].x=path[i].x;way[i].y=path[i].y;}way[deep].x=4;way[deep].y=4;return;}for(int i=0;i<4;i++){node v;v.x=cur.x+dirx[i];v.y=cur.y+diry[i];if(v.x<0||v.x>4||v.y<0||v.y>4)continue;if(a[v.x][v.y]==0){a[v.x][v.y]=1;path[deep].x=cur.x;path[deep].y=cur.y;dfs(v,deep+1);a[v.x][v.y]=0;}}
}
int main()
{for(int i=0;i<5;i++)for(int j=0;j<5;j++)cin>>a[i][j];node cur;cur.x=0;cur.y=0;dfs(cur,0);for(int i=0;i<=ans;i++)cout<<"("<<way[i].x<<", "<<way[i].y<<")"<<endl;return 0;
}
POJ 3984 迷宫问题 BFS DFS两种解法相关推荐
- POJ 3984 迷宫问题 BFS求最短路线+路径记录
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 31050 Accepted: 17826 Descriptio ...
- poj 3984 迷宫问题 BFS
/* 题目: 求最少时间从(0,0)走到(4,4)的路径 分析: 纯粹BFS题目,不过需要打印路径,可以用数组记录当前的坐标的上一个坐标, 因为BFS构造出一棵BFS最优生成树,每一个节点的父母节点都 ...
- 【POJ3126 Prime Path】【POJ 3087 Shuffle'm Up】【UVA 11624 Fire!】【POJ 3984 迷宫问题】
POJ3126Prime Path 给定两个四位素数a b,要求把a变换到b 变换的过程要 每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数 与 前一步得到的素数 只能有一个位 ...
- usaco Ordered Fractions 顺序的分数(两种解法)
这题很好玩,这里有两种解法. 第一种我自己写的,先找到所有的既约真分数,然后写了一个cmp函数进行排序最后输出.我写的时候还在想这章不是搜索吗这跟搜索关系不大吧,难道是怕我们思维定式化故意出的题不是搜 ...
- 牛客--追债之旅 两种解法
文章目录 第一种 第二种: 一共两种解法,所以即便你不会最短路,也可以做,甚至爆搜+剪枝的时间和空间消耗小于最短路做法. 第一种 题意: 小明现在要追讨一笔债务,已知有n座城市,每个城市都有编号,城市 ...
- 约瑟夫环问题的两种解法(详解)
约瑟夫环问题的两种解法(详解) 题目: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆 ...
- leetcode 73 矩阵置零 C++ 两种解法
leetcode 73 两种解法~~,没有一个是我想出来的,哈哈~~ one class Solution {public:void setZeroes(vector<vector<int ...
- 北林oj-算法设计与分析-Line up in the canteen(两种解法,附思路)
描述 One day, there is a kind of new delicious food from one of the windows in the canteen. All studen ...
- 洛谷——P1597 语句解析(两种解法)
P1597 语句解析(两种解法) 题目背景 木有背景-- 题目描述 一串长度不超过 255 的 PASCAL 语言代码,只有 a,b,c 3 个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变 ...
最新文章
- C# winform combobox默认选中项方法
- 使用pecl安装qqwry
- 装机必备软件 - 吾爱破解论坛会员专用版
- python 添加类属性
- Asp.net MVC中的ViewData与ViewBag
- android 按钮带图标 阴影_android中带图标的按钮(ImageButton)怎么用
- glibc:fd_set机制
- mycat核心配置详解(schema.xml配置)
- 计算机用户管理怎么进入,我有计算机管理员和受限用户不出现欢迎使用直接进入受限用户怎么办...
- 学渣的心酸(求职篇)
- mysql limti_MYSQL分页 limint
- Java数据结构-约瑟夫问题(Joseph环)
- GBK字库制作、字模数据读取、使用
- Windows系统以及office等一键激活
- 【Electron-vue】构建桌面应用(5)-Linux下打包安装程序deb文件
- CSDN调整文章图片
- 你想通过创业赚取人生中的第一桶金
- Recover a secret string from random triplets
- github连接显示隐私设置错误的解决方案
- 仿微信的录制小视频功能
热门文章
- Java微信APP支付-申请退款
- 邹城市计算机学业水平考试,山东省济宁市邹城市2020届九年级学业水平考试第一次模拟检测物理试题...
- IDEA的web项目文件夹添加蓝色小点
- Jon Skeet's C# and .NET articles and links
- AIOT:AI如何与IOT结合
- 电子统计台账:数据感知与模板找错
- python爬取头条好货广告_python 爬取今日头条关键词搜索
- 用python爬虫做一个二维码生成器
- 东湖高新区申报2022年市级产业化投资和技术改造专项以及工业智能化改造专项条件、材料和支持标准
- Planner 5D 4.1.12 特别版 Mac 家居室内设计软件