题目

之前比赛的一个题, 当时是崔老师做的,今天我自己做了一下。。。。

还要注意用bfs的时候  有时候并不是最先到达的就是答案,比如HDU 3442 这道题是要求最小的消耗血量伤害,但是并不是最先到达目标点的路径

就是最小的伤害,因为每一个点的伤害是 不一样的, 这种情况要用优先队列优化, 对伤害优化。

题意:*开始, X出口, b, y, r, g 代表钥匙,分别可以开B, Y, R, G颜色的门, 钥匙可以多次使用。问最短的步骤。

思路:vis[][]【】数组开三维,第三维记录状态 是否拿到该颜色的钥匙, 如果以相同的状态走到 相同的地方 就是重复,不能加进队列。

第三维用 二进制下相应的位来表示 是否拿到相应的钥匙。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = +;
int vis[maxn][maxn][], r, c;
char G[maxn][maxn];
int dx[] = {,,,-};
int dy[] = {,-,,};
char k[] = {'b', 'y', 'r', 'g'};
char d[] = {'B', 'Y', 'R', 'G'};
struct node
{
int x, y, key, step;
} next, pos; void bfs(int a, int b)
{
int i, j;
queue<node>q;
memset(vis, , sizeof(vis));
next.x = a;
next.y = b;
next.key = ;
next.step = ;
q.push(next);
vis[a][b][next.key] = ;
while(!q.empty())
{
pos = q.front();
q.pop();
for(i = ; i < ; i++)
{
next.x = pos.x+dx[i];
next.y = pos.y+dy[i];
next.step = pos.step+;
if(!(next.x>=&&next.x<=r&&next.y>=&&next.y<=c))
continue;
if(G[pos.x][pos.y]=='X')
{
printf("Escape possible in %d steps.\n", pos.step);
return;
}
if(G[next.x][next.y]=='#')
continue;
if(G[next.x][next.y]>='a' && G[next.x][next.y]<='z')
{
for(j = ; j < ; j++)
if(G[next.x][next.y]==k[j])
next.key = (pos.key|(<<j));
}
if(G[next.x][next.y]=='.'||G[next.x][next.y]=='*')
{
next.key = pos.key;
}
if(G[next.x][next.y]>='A' && G[next.x][next.y]<='Z')
{
for(j = ; j < ; j++)
if(G[next.x][next.y]==d[j])
{
if(pos.key&(<<j))
next.key = pos.key;
else
break;
}
if(j<)
continue;
}
if(vis[next.x][next.y][next.key]==)
{
vis[next.x][next.y][next.key] = ;
q.push(next);
}
}
}
printf("The poor student is trapped!\n");
}
int main()
{
int i, j;
int a, b;
while(cin>>r>>c)
{
if(r== && c==) break;
for(i = ; i <= r; i++)
{
getchar();
for(j = ; j <= c; j++)
{
cin>>G[i][j];
if(G[i][j]=='*')
{
a = i;
b = j;
}
}
}
bfs(a, b);
}
return ;
}

hdu 1885 Key Task (三维bfs)的更多相关文章

  1. hdu 1885 Key Task(bfs+位运算)

    题意:矩阵中'#'表示墙,'.'表示通路,要求从起点'*'到达终点'X',途中可能遇到一些门(大写字母),要想经过,必须有对应的钥匙(小写字母).问能否完成,若能,花费的时间是多少. 分析:同hdu ...

  2. hdu 1885 Key Task(bfs+状态压缩)

    Problem Description The Czech Technical University years of its existence . Some of the university b ...

  3. HDU 1885 Key Task (带门和钥匙的迷宫搜索 bfs+二进制压缩)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1885 Key Task Time Limit: 3000/1000 MS (Java/Others)  ...

  4. hdu 1885 Key Task

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1885 Key Task Description The Czech Technical Univers ...

  5. HDU 1885 Key Task(三维BFS)

    题目链接 题意 : 出口不止一个,一共有四种颜色不同的门由大写字母表示,而钥匙则是对应的小写字母,当你走到门前边的位置时,如果你已经走过相应的钥匙的位置这个门就可以走,只要获得一把钥匙就可以开所有同颜 ...

  6. HDU 1885 Key Task (BFS + 状态压缩)

    题意:给定一个n*m的矩阵,里面有门,有钥匙,有出口,问你逃出去的最短路径是多少. 析:这很明显是一个BFS,但是,里面又有其他的东西,所以我们考虑状态压缩,定义三维BFS,最后一维表示拿到钥匙的状态 ...

  7. HDU 1885 Key Task 国家压缩+搜索

    点击打开链接 Key Task Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  8. hdu 1885 Key Task(bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1885 再贴一个链接http://blog.csdn.net/u013081425/article/details ...

  9. hdu 1240:Asteroids!(三维BFS搜索)

    Asteroids! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

随机推荐

  1. windows android studio 编译Jni动态库

    项目需要,折腾了半天搞定windows android studio环境编译Jni动态库,现记录下来. 准备安装环境: 1. android studio 下载地址是http://www.androi ...

  2. PHP的会话处理函数session

    (๑•ᴗ•๑) PHP Session 变量 当运行一个应用程序时,你会打开它,做些更改,然后关闭它.这很像一次会话.计算机清楚你是谁.它知道你何时启动应用程序,并在何时终止.但是在因特网上,存在一个 ...

  3. 3144:[HNOI2013]切糕 - BZOJ

    题目描述 Description 经过千辛万苦小 A 得到了一块切糕,切糕的形状是长方体,小 A 打算拦腰将切糕切成两半分给小 B.出于美观考虑,小 A 希望切面能尽量光滑且和谐.于是她找到你,希望你 ...

  4. HDU 5486 Difference of Clustering 图论

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5486 题意: 给你每个元素一开始所属的集合和最后所属的集合,问有多少次集合的分离操作,并操作和不变操 ...

  5. android控件---spinner

    spinner下拉列表框的列表项有两种配置方式: 1.通过资源文件配置,通过在values种的xml,比如strings.xml中使用<string-array>元素添加制定列表项内容,然 ...

  6. sp_MSforeachtable使用方法 查看库中所有表的空间大小

    sp_MSforeachtable使用方法 1)说明系统存储过程sp_MSforeachtable和sp_MSforeachdb,是微软提供的两个不公开的存储过程,从ms sql 6.5开始.存放在S ...

  7. JMeterPluginCMD命令行工具使用详解

    MeterPluginCMD命令行工具生成png图片和csv统计文件 Jmeter是个纯java的开源的轻量级性能测试工具,功能强大.因为是轻量级的,与loadrunner相比,报告统计的相对较少.不 ...

  8. spring webservice 开发demo (实现基本的CRUD 数据库采用H2)

    在实现过程中,遇到两个问题: 1: schema 写错: 错误: http://myschool.com/schemas/st 正确: http://myschool.com/st/schemas   ...

  9. 用 React 编写2048游戏

    1.代码 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="U ...

  10. 简单的自绘CListBox,重载虚MeasureItem和DrawItem这两个虚函数

    [cpp] view plain copy //例如CNewListBox继承自CListBox,重载虚MeasureItem和DrawItem这两个虚函数,代码如下: void CNewListBo ...