题目链接:

pid=2102">http://acm.hdu.edu.cn/showproblem.php?pid=2102

这道题属于BFS+优先队列

開始看到四分之中的一个的AC率感觉有点吓人,后来一做感觉就是模板改了点东西而已,一遍就AC了,只是在主函数和全局变量里面都定义了n和m导致我白白浪费了debug的时间。

果然全局变量得小心用啊。

跟模板一样的,定义一个结构体,仅仅只是多加了个參数,就是迷宫的层数,我用0代表第一层。1代表第二层,这在数组里面会体现的。

struct node {
int index;//层数
int x,y;//坐标
int time;
friend bool operator <(const node &a,const node &b){
//时间少的放在队列前面
return a.time>b.time;
}
};

我定义的那个map是
char map[2][11][11];

map[层数][x][y]这种。

还有个can_go 函数检測当前点是否可走:

int can_go(int index,int x,int y){
if(x<0||x>=n||y<0||y>=m||map[index][x][y]=='*'){
return 0;
}
return 1;
}

我大概就讲一下跟模板题有啥不同吧。

这道题里面会遇到传送门’#’仅仅要遇到就把当前层格子标记为已经过vis[index][x][y]=1之后立刻飞到还有一层即可了,注意,若还有一层是墙那就挂了,说明这里不能走,直接continue换个方向继续。或者还有一层同一位置也是传送门’#’那也不行,也continue即可了

if(map[!next.index][next.x][next.y]=='*'||
<span style="white-space:pre"> </span>map[!next.index][next.x][next.y]=='#'){
<span style="white-space:pre"> </span>continue;
}

之后仅仅要队列不为空。就取出队列的头节点,推断是否为终点,假设是,则返回到达当前节点所需时间即:now.time;若不是,那接下来把now的四个方向所有遍历一遍。假设遍历到达不是墙就将其增加队列。而且把当前time更新:next.time=now.time+1。一直循环直到que.top出来的坐标代表的是终点为止。

贴个代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue> using namespace std; char map[2][11][11];
int vis[2][11][11];
int t,n,m;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; struct node {
int index;//层数
int x,y;//坐标
int time;
friend bool operator <(const node &a,const node &b){
//时间少的放在队列前面
return a.time>b.time;
}
}; int can_go(int index,int x,int y){
if(x<0||x>=n||y<0||y>=m||map[index][x][y]=='*'){
return 0;
}
return 1;
} //bfs若time > T 则返回 -1
int bfs(int index,int x,int y){
priority_queue<node>que;
int i;
node now,next;
memset(vis,0,sizeof(vis)); now.index=index;
now.x=x;
now.y=y;
now.time=0; vis[index][x][y]=1;
que.push(now);
while(!que.empty()){
now=que.top();
que.pop();
if(now.time>t){
return -1;
}
if(map[now.index][now.x][now.y]=='P'){
return 1;
}
for(i=0;i<4;i++){
next.index=now.index;
next.x=now.x+dir[i][0];
next.y=now.y+dir[i][1];
if(!vis[next.index][next.x][next.y] && can_go(next.index,next.x,next.y)){
vis[next.index][next.x][next.y]=1;
if(map[next.index][next.x][next.y]=='#'&&!vis[!next.index][next.x][next.y]){ if(map[!next.index][next.x][next.y]=='*'||
map[!next.index][next.x][next.y]=='#'){
continue;
}
next.index=!next.index;
vis[next.index][next.x][next.y]=1;
next.time=now.time+1;
que.push(next);
}
else {
next.time=now.time+1; que.push(next);
}
}
}
}
return -1;
} int main()
{
int ans;
int i;
int c;
scanf("%d",&c);
while(c--){
scanf("%d%d%d",&n,&m,&t);
//printf("%d%d%d",n,m,t);
for(i=0;i<n;i++){
scanf("%s",map[0][i]);
}
for(i=0;i<n;i++){
scanf("%s",map[1][i]);
} ans=bfs(0,0,0);
if(ans==-1){
printf("NO\n");
}
else printf("YES\n");
}
return 0;
}

hdu 2102 A计划 具体题解 (BFS+优先队列)的更多相关文章

  1. hdu 2102 A计划(双层BFS)(具体解释)

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php ...

  2. HDU 2102 A计划【三维BFS】

    A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...

  3. HDU - 2102 A计划(双层BFS)

    题目: 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚, ...

  4. HDU 2102 A计划 DFS与BFS两种写法 [搜索]

    1.题意:一位公主被困在迷宫里,一位勇士前去营救,迷宫为两层,规模为N*M,迷宫入口为(0,0,0),公主的位置用'P'标记:迷宫内,'.'表示空地,'*'表示墙,特殊的,'#'表示时空传输机,走到这 ...

  5. HDU 2102 A计划(两层地图加时间限制加传送门的bfs)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Time Limit: 3000/1000 MS (Java/Others)    Me ...

  6. hdu 2102 A计划

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸 ...

  7. hdu - 2102 A计划 (简单bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=2102 题目还是不难,注意起点一定是(0,0,0),然后到达P点时间<=t都可以. 用一个3维字符数组存储图 ...

  8. HDU 2102 A计划(BFS/DFS走迷宫)

    A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  9. HDU 2102 A计划(BFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 题目大意:公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输 ...

随机推荐

  1. Linux系统下安装 rpm 软件和源代码 软件包

    RPM 安装方式 RPM是一个包安装管理软件,我们可以使用这个工具安装 .rpm 类型的软件.Linux的rpm包很多都能在光盘的Packages 包中找得到.首先挂载一下光盘,查看Packages中 ...

  2. NOIP2018提高组金牌训练营——字符串专题

    NOIP2018提高组金牌训练营——字符串专题 1154 回文串划分 有一个字符串S,求S最少可以被划分为多少个回文串. 例如:abbaabaa,有多种划分方式.   a|bb|aabaa - 3 个 ...

  3. Tire树总结(模板+例题)

    题目来自<算法竞赛设计指南> Tire树是一种可以快速查找字符串的数据结构 模板 #include<cstdio> #include<algorithm> #inc ...

  4. 实现双向数据绑定mvvm

    实现双向数据绑定mvvm  

  5. HDU 4333 Contest 4

    一开始就想到了扩展KMP,因为只有扩展KMP才是处理后缀的.但忽然短路以为扩展KMP求的是最长公共后缀,囧....又浪费了很多时间,都是对这个算法练得不多 再看那个扩展KMP算法之后,就很确定要的就是 ...

  6. 强名称程序集(strong name assembly)——为程序集赋予强名称

    ,唯一标识一个程序集 2,放置程序集被仿冒和被篡改. 3,能够部署到全局程序集缓存(GAC:GlobalAssembly Cache)中:在将强名称程序集不熟在GAC其中以后,强名称程序集也能够称为共 ...

  7. POJ 1765 November Rain

    题目大意: 有一些屋顶,相当于一些线段(不想交). 问每一条线段能够接到多少水,相对较低的屋顶能够接到高屋顶留下的水(如题图所看到的).因为y1!=y2,所以保证屋顶是斜的. 解题思路: 扫描线,由于 ...

  8. D3js-绘制地图时出现过小, 设置scale还是无效 的解决方法

    使用d3绘制某个地市的地图时,把scale成非常大但是还是无法达到想要的效果. //---------------------------------------------------------- ...

  9. c++:数据类型的推断type_traits

    //推断左值右值引用 void main() { int i(10);//i是左值 有内存实体 int &ri(i); int &&rri(i + 5);//右值引用 cout ...

  10. JS冒泡事件 与 事件捕获

    JS冒泡事件 与 事件捕获 案例 <!DOCTYPE html> <html> <head> <title>冒泡事件</title> < ...