题目链接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

最新文章

  1. 【USACO 2.3】Controlling Companies (递推)
  2. 【SSM 6】Spring+SpringMVC+Mybatis框架搭建步骤
  3. Remove Duplicates From Sorted Array
  4. Bootstrap 弹出框和警告框插件
  5. Orcale(一)概念
  6. spring dataSourceRouter自动切换数据源
  7. Storm技术结合
  8. 【Apache KafKa系列之一】KafKa安装部署
  9. VUE依赖webpack分别给开发环境和生产环境配置不同的常量值并在项目中动态引用
  10. 平方根的C语言实现(三) ——最终程序实现
  11. jquery 滚动事件
  12. VisualStudio 快捷键
  13. QML-关于Qt.rgba()颜色无法正常显示问题
  14. [Python]基础教程(2)、PyCharm安装及中文编码
  15. 515. Find Largest Value in Each Tree Row查找一行中的最大值
  16. MySQL的binlog操作
  17. RabbitMQ基础组件和SpringBoot整合RabbitMQ简单示例
  18. Java并发编程--6.Exchanger线程间交换数据
  19. 谁是最快的Go Web框架
  20. MVVM特点、源(数据)与目标(如:控件等)的映射

热门文章

  1. ORACLE10G工作原理
  2. Python win7下 django-admin.py startproject mysite命令没有创建mysite?
  3. 用sed删除空行
  4. spring boot实战(第十二篇)整合RabbitMQ
  5. 《ASP.NET MVC4 WEB编程》学习笔记------Entity Framework的Database First、Model First和Code Only三种开发模式
  6. Selenium webdriver 学习总结-元素定位
  7. c++0x新特性实例(比较常用的)
  8. 不使用arc功能时的编译参数 –fno-objc-arc
  9. 解决 jersey javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.java:119)
  10. C/C++函数参数读取顺序2