HDU 1429 (BFS+记忆化状压搜索)
2024-09-23 05:54:12
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1429
题目大意:最短时间内出迷宫,可以走回头路,迷宫内有不同的门,对应不同的钥匙。
解题思路:
要是没有门和钥匙,而且不能走回头路,就是个简单粗暴的BFS。
有了门之后,就要状态压缩+记忆化搜索。不然这个图会搜死你。
本题的状态压缩基于一个事实:尽管可以走回头路,但是回头是有理由的,你要么开了门,要么拿了钥匙,使状态发生改变。
否则等于多绕了一步,浪费时间,应该及时剪枝。
f[x][y][key]保存的是在(x,y)点,手里钥匙是key(位压缩)的状态。
那么对于门,key&(1<<k)检测当前是否有该门的钥匙。
对于钥匙,key|(1<<k)获得钥匙。
每次push之前,记录一下f[x][y][key]就行了
#include "cstdio"
#include "cstring"
#include "string"
#include "iostream"
#include "queue"
using namespace std;
int n,m,t,sx,sy,ex,ey,f[][][],dir[][]={-,,,,,-,,},ans;
char map[][];
struct status
{
int x,y,dep,key;
status(int x,int y,int dep,int key):x(x),y(y),dep(dep),key(key) {}
};
void bfs(int x,int y)
{
queue<status> Q;
Q.push(status(x,y,,));
f[x][y][]=;
bool flag=false;
while(!Q.empty())
{
if(flag) break;
status t=Q.front();Q.pop();
for(int s=;s<;s++)
{
int X=t.x+dir[s][],Y=t.y+dir[s][],key=t.key;
if(X<||X>n||Y<||Y>m||map[X][Y]=='*') continue;
if(isupper(map[X][Y]))
{
int k=map[X][Y]-'A';
if(!(key&(<<k))) continue;
}
if(islower(map[X][Y]))
{
int k=map[X][Y]-'a';
key=t.key|(<<k);
}
if(f[X][Y][key]) continue;
f[X][Y][key]=;
if(X==ex&&Y==ey) {flag=true;ans=min(ans,t.dep+);}
Q.push(status(X,Y,t.dep+,key));
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
ios::sync_with_stdio(false);
string tt;
while(cin>>n>>m>>t)
{
memset(f,,sizeof(f));
ans=<<;
for(int i=;i<=n;i++)
{
cin>>tt;
for(int j=;j<tt.size();j++)
{
map[i][j+]=tt[j];
if(tt[j]=='@') {sx=i;sy=j+;}
if(tt[j]=='^') {ex=i;ey=j+;}
}
}
bfs(sx,sy);
if(ans<t) cout<<ans<<endl;
else cout<<"-1"<<endl;
}
}
11876984 | 2014-10-15 13:22:15 | Accepted | 1429 | 562MS | 3664K | 1744 B | C++ | Physcal |
最新文章
- 【USACO 2.3】Controlling Companies (递推)
- 【SSM 6】Spring+SpringMVC+Mybatis框架搭建步骤
- Remove Duplicates From Sorted Array
- Bootstrap 弹出框和警告框插件
- Orcale(一)概念
- spring dataSourceRouter自动切换数据源
- Storm技术结合
- 【Apache KafKa系列之一】KafKa安装部署
- VUE依赖webpack分别给开发环境和生产环境配置不同的常量值并在项目中动态引用
- 平方根的C语言实现(三) ——最终程序实现
- jquery 滚动事件
- VisualStudio 快捷键
- QML-关于Qt.rgba()颜色无法正常显示问题
- [Python]基础教程(2)、PyCharm安装及中文编码
- 515. Find Largest Value in Each Tree Row查找一行中的最大值
- MySQL的binlog操作
- RabbitMQ基础组件和SpringBoot整合RabbitMQ简单示例
- Java并发编程--6.Exchanger线程间交换数据
- 谁是最快的Go Web框架
- MVVM特点、源(数据)与目标(如:控件等)的映射
热门文章
- ORACLE10G工作原理
- Python win7下 django-admin.py startproject mysite命令没有创建mysite?
- 用sed删除空行
- spring boot实战(第十二篇)整合RabbitMQ
- 《ASP.NET MVC4 WEB编程》学习笔记------Entity Framework的Database First、Model First和Code Only三种开发模式
- Selenium webdriver 学习总结-元素定位
- c++0x新特性实例(比较常用的)
- 不使用arc功能时的编译参数 –fno-objc-arc
- 解决 jersey javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.java:119)
- C/C++函数参数读取顺序2