hdu1240/poj2225 BFS广搜的再理解
版权声明:本文为博主原创文章,未经博主同意不得转载。
https://blog.csdn.net/guodongxiaren/article/details/37756347
原题地址
pid=1240" rel="nofollow">HDUOJ
题目介绍
题意
这相同是一道搜索题,所不同的是要搜索的图是三维的而不是二维的。但这并没什么大的改变。仅仅是添加了两个搜索的方向而已。
陷阱
要注意的地方是,所给出的起点终点的坐标是依照 列,行,层的顺序。
关于BFS
与DFS不同,BFS能保证所搜到的路径一定是最短路径,所以我们不须要维护一个多维(此处为3维)数组来记录訪问到每一点的最小步数,仅仅须要维护一个多维数组来标记是否走过就能够了。DFS中是要不停回溯来找最短路径的。可是BFS是不须要的。这是BFS本身的性质所决定的,BFS能保证第一次搜索到某一点时所走的路径就是到该点的最短路径。
以后假设还能再走到该点,那么所走的路径一定是大于等于第一次搜索到的路径的。
所以,BFS是不须要回溯的。(自己之前也有误解。。
囧)
代码
#include<iostream>
#include<queue>
using namespace std;
#include<cstdio>
#include<cstring>
#define INF 0x3f3f3f3f
struct node
{
int x,y,z;
int level;
node(int i,int j,int k,int l):x(i),y(j),z(k),level(l){};
void set(int i,int j,int k,int l)
{
x=i;
y=j;
z=k;
level=l;
}
};
int d[6][3]={0,1,0,0,-1,0,1,0,0,-1,0,0,0,0,1,0,0,-1};
char m[10][10][10];
bool used[10][10][10];
int s[3],e[3];
int n,step;
queue<node> q;
void bfs(int x,int y,int z)
{
int i,j,k,l;
node pos(x,y,z,0);
q.push(pos);
used[x][y][z]=1;
while(!q.empty())
{
pos = q.front();
i = pos.x;
j = pos.y;
k = pos.z;
l = pos.level;
q.pop();
if(i==e[2]&&j==e[1]&&k==e[0])
{
if(l<step)
step=l;
continue;
}
for(int t=0;t<6;t++)
{
x=i+d[t][0];
y=j+d[t][1];
z=k+d[t][2];
if(x<0||x>=n||y<0||y>=n||z<0||z>=n||m[x][y][z]!='O'||used[x][y][z])
continue;
pos.set(x,y,z,l+1);
used[x][y][z]=1;
q.push(pos);
}
}
}
int main()
{
char str[6];
while(cin>>str>>n)
{
memset(used,0,sizeof used);
step = INF;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
cin>>m[i][j][k];
cin>>s[0]>>s[1]>>s[2]>>e[0]>>e[1]>>e[2];
cin>>str;
bfs(s[2],s[1],s[0]);
if(step!=INF)
cout<<n<<" "<<step<<endl;
else
cout<<"NO ROUTE"<<endl;
}
}
used数组表示是否走过。1为走过。0为没有走过。
hdu1240/poj2225 BFS广搜的再理解的更多相关文章
- hdu 1180:诡异的楼梯(BFS广搜)
诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Subm ...
- hdu 1242:Rescue(BFS广搜 + 优先队列)
Rescue Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- hdu 1195:Open the Lock(暴力BFS广搜)
Open the Lock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- BFS广搜题目(转载)
BFS广搜题目有时间一个个做下来 2009-12-29 15:09 1574人阅读 评论(1) 收藏 举报 图形graphc优化存储游戏 有时间要去做做这些题目,所以从他人空间copy过来了,谢谢那位 ...
- hdu 1026:Ignatius and the Princess I(优先队列 + bfs广搜。ps:广搜AC,深搜超时,求助攻!)
Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- hdu 2717:Catch That Cow(bfs广搜,经典题,一维数组搜索)
Catch That Cow Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 2612:Find a way(经典BFS广搜题)
Find a way Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- Catch That Cow(BFS广搜)
Description Farmer John has been informed of the location of a fugitive cow and wants to catch her i ...
- POJ3984 BFS广搜--入门题
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20816 Accepted: 12193 Descriptio ...
随机推荐
- 仿迅雷播放器教程 -- 基于VLC的C++播放器 (4)
经过前面的介绍,想必大家对VLC和ffmpeg都有一定印象了,还记得学习ffmpeg多么蛋疼吗?那么VLC会不会也这么蛋疼呢? 那么我们来看一段官方的Demo,Alberl精简了Demo,只留 ...
- tar分层压缩
在Linux下使用 tar 命令来将文件打包并压缩是很通常的用法了. 可是Linux的文件系统对文件大小有限制,也就是说一个文件最大不能超过2G,如果压缩包的的内容很大,最后 的结果就会超过2G,又或 ...
- Android开发训练之第五章第七节——Transmitting Network Data Using Volley
Transmitting Network Data Using Volley GET STARTED DEPENDENCIES AND PREREQUISITES Android 1.6 (API L ...
- 为什么HTML使用<!DOCTYPE HTML>
不管是刚接触前端,还是你已经“精通”web前端开发的内容,你应该知道在你写html的时候需要定义文档类型:你知道如果没有它,浏览器在渲染页面的时候会使用怪异模式:你知道各个浏览器在怪异模式下对各个元素 ...
- js 使用a标签 下载资源
文档 let data = new Blob(['hello ajanuw'], { type: 'application/text' }) let src = window.URL.createOb ...
- hdu3374 String Problem【最小表示法】【exKMP】
String Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- python web篇 Django centos 命令版
新建立一个虚拟环境,与其他python 包隔开互不影响 首先新建立一个目录,命名为xx, python3 下操作 $:python -m venv ll_env 注意在有多个Python环境下,使用 ...
- 关于Java程序流程控制的整理(已完善)
- 关于学习oi的一些事项
我只是突然有感而发!(脑抽罢了 我其实是那种一直都没有计划说去学什么的人. 当然也不是那种点开洛谷一道题去写这道题不会就去学习相应的知识点的人. 随着洛谷 poj bzoj HDU CH Vojs 等 ...
- 深入hash
hash真的很好用,这些杂一点的知识点我觉得还是很有必要的,对还有离散化. 1<=N<=1,000,000,其它所有数据都在[0...1,000,000,000]范围内 看起来很简单一道水 ...