POJ3904(BFS算法)

Problem Descrption

Promble 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

左上角到右下角的最短路径,格式如样例所示。

(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)

问题链接:http://poj.org/problem?id=3984
问题分析:之前利用DFS的模板坐过一次,最近试着用BFS的算法做了一次,BFS效率较高,用到队列queue

AC代码:

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<queue>
using namespace std;
int n[4][2] = { 1,0,0,1,-1,0,0,-1 };
int vis[5][5];
int map[5][5];
struct id
{int x, y;
};
struct id ed[5][5];
void BFS()
{struct id t;queue<id>q;t.x = 0, t.y = 0;q.push(t);vis[0][0] = 1;ed[0][0].x = 0;ed[0][0].y = 0;while (!q.empty()){struct  id a = q.front();if (a.x == 4 && a.y == 4)return;q.pop();for (int i = 0; i < 4; i++){int tx = a.x + n[i][0], ty = a.y + n[i][1];if (tx < 0 || ty < 0 || tx>4 || ty>4 || vis[tx][ty]||map[tx][ty])continue;struct id b;b.x = tx, b.y = ty;q.push(b);vis[tx][ty] = 1;ed[tx][ty].x = a.x;ed[tx][ty].y = a.y;}}}
int main()
{for (int i = 0; i < 5; i++)for (int j = 0; j < 5; j++)scanf("%d", &map[i][j]);BFS();int m[30][2], t = 0,x=4,y=4,p;while (1){m[t][0] = x, m[t][1] = y;t++;if(x == 0 && y == 0)break;p = x;x = ed[x][y].x, y = ed[p][y].y;}for (int i = t-1; i >= 0; i--){printf("(%d, %d)\n", m[i][0], m[i][1]);}
}

附上详细注释的他人的代码:

本篇先以一道题的题解来说明问题模板可以大体分成6部分
1.头文件段
2.坐标结构体段
3.障碍物预设段
4.已访问结点和移动坐标段
5.BFS算法函数段
6.主函数段定义一个二维数组: 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)1.头文件段
//这里使用c++的<queue>函数,这样可以快速进行队列的操作,没啥好解释的,背下
#include<iostream>
using namespace std;
#include<stdio.h>
#include<string.h>
#include<queue>2.坐标结构体段
//记录结点坐标,特别注意,这里的坐标也可能是一维的,不要死板,具体情况具体分析。
struct mi{int x;int y;
}ca;3.障碍物预设段(有可能没有,是无障碍题目)
//这里往往是初始化好的迷宫地图,或是什么其他条件的障碍物,在这里1就是障碍物,
这个地图要么是自己输入,要么是题目已知条件
int map[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},}   
struct mi zhen[5][5];  //这里记录着路径子节点与父节点的对应关系在5中详解4.已访问结点和移动坐标段
//注意移动坐标要一一对应,可以使用二维数组,代表着在迷宫中怎样移动
int visited[5][5];     //用来记录已访问节点,但是也可以不要这个数组,每次走到后直接改变图,
把此节点的内容直接变成障碍物即可
int xx[4]={1,-1,0,0};
int yy[4]={0,0,-1,1};5.BFS算法函数段
//这里主要是对BFS算法的套用,具体可以看下列详细注释
注意:凡是写到背下的,说明其基本可以完全复用,而且处于此模板的核心部分void BFS()
{memset(visited,0,sizeof(visited));       //背下,初始化已访问数组queue<mi>q;                              //背下,初始化队列struct mi A;                             //背下,把第一个结点压入队列里A.x=0;                                   //初始化第一个节点坐标 没啥好说的A.y=0;                                                                                        visited[0][0]=1;                         //初始化首已访问节点,说明自己已被访问zhen[0][0].x=0;                          //初始化对应关系底层结点  下面将详细解释zhen[0][0].y=0;//特别注意:千万不要死板,此题是走迷宫,所以首节点是左上角,其他题可不一定,千万不要一堆0就上去了q.push(A);                              //将首节点压入队列                 while(!q.empty())                       //背下,只要队列里还有东西就继续{struct mi te=q.front();             //这两句背下q.pop();if(te.x==4&&te.y==4)                //找到答案后退出 return;//特别注意:不一定都需要退出条件,如果题目要求我们对单节点进行移动(后面会提到)for(int i=0;i<4;i++)                //背下,把各个方向都试着走一遍{int zx=te.x+xx[i];              //zx,zy为移动后节点坐标int zy=te.y+yy[i];if(zx<0||zx>4||zy<0||zy>4||map[zx][zy]||visited[zx][zy])      //背下,判断是否为合法路径,比如墙和已走过节点都为非法路径,但让我前面提到过,可以把已走过节点直接在地图上变成墙也行,这样就不需要visited数组continue;visited[zx][zy]=1;              //将已访问节点标志为1  下标对应当前节点struct mi kao;                  //背下,将合法子节点压入队列kao.x=zx;kao.y=zy;q.push(kao);//记录着谁走到了它zhen[zx][zy].x=te.x;           //现在来说明这个二维数组怎样记录最短路径,首先这个数组里存的是坐标结构体,数组下标代表着子节点坐标,而数组内容存着父节点坐标,这样皆可以通过循环,一级一级找上去,既可以知道最短路径长度,也可以打印所有经过的节点坐标zhen[zx][zy].y=te.y;}}          
}6.主函数部分
//略写 这没什么好说的 根据题目要求不同这个地方的灵活性也最大
int main(void)                   
{for(int m=0;m<5;m++)                  //初始化迷宫地图{for(int n=0;n<5;n++){scanf("%d",&map[m][n]);}}BFS();            int num[30][2];int x=4,y=4;int i=0;while(1){                                //把父子节点关系倒着取出放入数组中以便打印int k;k=x;x=zhen[x][y].x;y=zhen[k][y].y;num[i][0]=x;num[i][1]=y;  i++;if(x==0&&y==0)break;}for(int j=i-1;j>=0;j--){printf("(%d, %d)\n",num[j][0],num[j][1]);          //打印路径节点部分}printf("(4, 4)");     return 0;
}
--------------------- 
作者:jiange702 
来源:CSDN 
原文:https://blog.csdn.net/jiange702/article/details/81365005 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转:SparkConf 配置的用法

Spark应用程序的配置&#xff0c;用于将各种Spark参数设置为键值对。 大多数情况下&#xff0c;将使用新的SparkConf(),创建一个SparkConf对象&#xff0c;该对象将从您的应用程序中设置的任何spark.*的Java系统属性加载值。 在这种情况下&#xff0c;** 直接在SparkConf对象上…

Spring MVC 基于URL的拦截和映射规则

转载自 Spring MVC 基于URL的映射规则&#xff08;注解版&#xff09; url-pattern 如果看过前一篇入门的帖子&#xff0c;应该了解到spring mvc在启动前必须要在web.xml中配置servlet&#xff0c;这样才能拦截到想要映射的url地址。 <servlet><servlet-name>Spr…

转自: SparkConf 配置的概念和用法

一&#xff1a;概念 Spark应用程序的配置&#xff0c;用于将各种Spark参数设置为键值对。 大多数情况下&#xff0c;将使用新的SparkConf(),创建一个SparkConf对象&#xff0c;该对象将从您的应用程序中设置的任何spark.的Java系统属性加载值。 在这种情况下&#xff0c;* 直接…

HDU1231(最大连续子序列)

给定K个整数的序列{ N1, N2, ..., NK }&#xff0c;其任意连续子序列可表示为{ Ni, Ni1, ..., Nj }&#xff0c;其中 1 < i < j < K。最大连续子序列是所有连续子序列中元素和最大的一个&#xff0c; 例如给定序列{ -2, 11, -4, 13, -5, -2 }&#xff0c;其最大连续子…

漫画:什么是人工智能

转载自 漫画&#xff1a;什么是人工智能什么是人工智能&#xff1f;人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI&#xff0c;它是研究、开发用于模拟和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。上个世纪50年代一次…

(精华)转:RDD:创建的几种方式(scala和java)

转&#xff1a; https://blog.csdn.net/weixin_38750084/article/details/82769600 这篇文章非常棒&#xff0c; 用代码实际演示了如何创建RDD&#xff1b; 本文主要转载了 java创建RDD的两种方式&#xff0c; 【方式1】 下面开始初始化spark spark程序需要做的第一件事情&…

POJ3278(BFS入门)

Problem Descrption Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Far…

漫画:什么是架构师

转载自 什么是架构师&#xff1f; 架构师英文architect&#xff0c;这个词源于建筑学。软件工程当中的架构师和建筑工程当中建筑师有许多相通之处&#xff0c;都是负责“产品”宏观的架构设计。在一个团队里&#xff0c;架构师充当了技术Leader的角色&#xff0c;不仅要完成项目…

转:随机过程好书推荐

转自&#xff1a; https://blog.csdn.net/rastlos/article/details/8928510 随机过程实在太重要了,用当年林元烈上课给我们说的一句话,"随机数学充满了魅力与威力"来形容随机过程再合适不过了.当然,随机过程比较难,故有"随机过程随机过"一说.这里,我就把美…

漫画:什么是机器学习

转载自 漫画&#xff1a;什么是机器学习故事一&#xff1a;瑞雪兆丰年我们中国有一句关于农业生产的古老谚语&#xff1a;瑞雪兆丰年。 就是说&#xff0c;如果前一年冬天下雪很大很多&#xff0c;那么第二年庄稼丰收的可能性比较大。 这条谚语是怎么来的呢&#xff1f;我们可以…

转:高等数学、线性代数、概率论数理统计书籍推荐

转&#xff1a; https://blog.csdn.net/Yahuvi/article/details/54692504 导语 最近在学习机器学习&#xff0c;发现需要恶补数学知识。总感觉国内大学的教材只适合考试&#xff0c;对数学知识的理解和运用不到位。现整理一些评价很高的书&#xff0c;总的来说较适合工科类的…

二叉树:HDU1754

很多学校流行一种比较的习惯。老师们很喜欢询问&#xff0c;从某某到某某当中&#xff0c;分数最高的是多少。 这让很多学生很反感。 不管你喜不喜欢&#xff0c;现在需要你做的是&#xff0c;就是按照老师的要求&#xff0c;写一个程序&#xff0c;模拟老师的询问。当然&…

转:微服务设计、拆分原则

转自&#xff1a; https://www.cnblogs.com/guanghe/p/10978349.html 一、AKF拆分原则 业界对于可扩展系统架构设计有一个朴素的理念&#xff1a;通过加机器就可以解决容量和可用性问题。 这一理念在云计算概念疯狂流行的今天&#xff0c;得到了广泛的认可&#xff0c;对于一个…

漫画:什么是中间人攻击

转载自 漫画&#xff1a;什么是中间人攻击故事发生在上世纪40年代......在解放战争初期&#xff0c;东北牡丹江一带&#xff0c;奶头山有一个土匪副官叫栾平。他计划将包含重要信息的先遣图&#xff0c;献给威虎山的土匪头子座山雕。而后栾平被共军抓获&#xff0c;侦查员杨子荣…

微信小程序的setData

1.setData&#xff08;&#xff09;中修改为bool类型不要加" " 例&#xff1a;setData({"a":false}) 2.修改以变量作为索引值的数组时的语法为 this.setData({ [ judge[${current}] ]: true })

转:AKF 扩展立方体

转&#xff1a; https://www.cnblogs.com/fengyc/p/12286726.html AKF 扩展立方体&#xff08;AKF Scale Cube&#xff09;是一个描述从单体应用到可扩展架构的模型&#xff0c;见 (https://akfpartners.com/growth-blog/scale-cube)[https://akfpartners.com/growth-blog/scal…

漫画:三分钟了解敏捷开发

转载自 漫画&#xff1a;三分钟了解敏捷开发 什么是敏捷开发&#xff1f; 敏捷开发&#xff08;Agile&#xff09;是一种以人为核心、迭代、循序渐进的开发方法。 在敏捷开发中&#xff0c;软件项目的构建被切分成多个子项目&#xff0c;各个子项目的成果都经过测试&#xff0c…

微信小程序数组的坑

定义和用法 splice() 方法用于添加或删除数组中的元素。 注意&#xff1a;这种方法会改变原始数组。 返回值 如果仅删除一个元素&#xff0c;则返回一个元素的数组。 如果未删除任何元素&#xff0c;则返回空数组。 主要&#xff1a;array.splice(index,howmany&#xff09…

转: 理解RESTful架构

转自&#xff1a; http://www.ruanyifeng.com/blog/2011/09/restful.html 作者&#xff1a; 阮一峰 日期&#xff1a; 2011年9月12日 越来越多的人开始意识到&#xff0c;网站即软件&#xff0c;而且是一种新型的软件。 这种"互联网软件"采用客户端/服务器模式&a…

Git 12 岁了,送给你 12 个 Git 使用技巧

转载自 Git 12 岁了&#xff0c;送给你 12 个 Git 使用技巧Git&#xff0c;一个分布式版本控制系统&#xff0c;它已经成为了开源世界的源码控制默认工具&#xff0c;在4月7号12岁了。但是使用Git中更另人沮丧的是&#xff0c;你需要了解多少才能让你更有效的使用它。同时这也是…