思路:有十个门,有十把钥匙,每把钥匙对应一个门,相同的门可以有多个。这样,我们就得按照状态来搜索,用0000000001代表第一个门有钥匙了,1000000000代表第十个门钥匙有了.......一次类推,可以用二进制来表示.......遇到钥匙,可以先拾起这个钥匙,用|;遇到门,可以判断是否有这个门的钥匙,把门状态位移后,&就好........

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int t[4][2]={1,0,-1,0,0,1,0,-1},vist[25][25][5000];
char str[25][25];
int n,m,tj,flag=0,ans=0;
int qx,qy,zx,zy;
struct node
{
int x,y;
int time;
int k;
};
void bfs()
{
queue<node>q;
node p;
p.x=qx;
p.y=qy;
p.time=0;
p.k=0;
q.push(p);
while(!q.empty())
{
node p1;
p1=q.front();
q.pop();
if(p1.time>=tj)
return;
if(p1.x==zx&&p1.y==zy)
{
flag=1;
ans=p1.time;
break;
} for(int i=0;i<4;i++)
{
node p2;
p2.x=p1.x+t[i][0];
p2.y=p1.y+t[i][1];
p2.time=p1.time+1;
p2.k=p1.k;
if(p2.x>=0&&p2.x<n&&p2.y>=0&&p2.y<m&&str[p2.x][p2.y]!='*')
{ if('a'<=str[p2.x][p2.y]&&str[p2.x][p2.y]<='z')
{
p2.k=p2.k|(1<<(str[p2.x][p2.y]-'a'));
if(!vist[p2.x][p2.y][p2.k])
{
vist[p2.x][p2.y][p2.k]=1;
q.push(p2);
}
}
else
if('A'<=str[p2.x][p2.y]&&str[p2.x][p2.y]<='Z')
{
int k=p2.k&(1<<(str[p2.x][p2.y]-'A'));
if(!vist[p2.x][p2.y][p2.k]&&k)
{
vist[p2.x][p2.y][p2.k]=1;
q.push(p2);
}
}
else if(vist[p2.x][p2.y][p2.k]==0)
{
vist[p2.x][p2.y][p2.k]=1;
q.push(p2);
}
}
}
}
}
int main()
{
while(scanf("%d%d%d",&n,&m,&tj)>0)
{
for(int i=0;i<n;i++)
scanf("%s",str[i]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(str[i][j]=='@')
{
qx=i;
qy=j;
}
if(str[i][j]=='^')
{
zx=i;
zy=j;
}
}
flag=0;
ans=0;
memset(vist,0,sizeof(vist));
bfs();
if(flag==0)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}

hdu1429(bfs+状态压缩)的更多相关文章

  1. HDU1429+bfs+状态压缩

    bfs+状态压缩思路:用2进制表示每个钥匙是否已经被找到.. /* bfs+状态压缩 思路:用2进制表示每个钥匙是否已经被找到. */ #include<algorithm> #inclu ...

  2. BFS+状态压缩 HDU1429

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  3. ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))

    求一条蛇到(1,1)的最短路长,题目不简单,状态较多,需要考虑状态压缩,ZOJ的数据似乎比POj弱一些 POJ1324(ZOJ1361)-Holedox Moving 题意:一条已知初始状态的蛇,求其 ...

  4. BFS+状态压缩 hdu-1885-Key Task

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...

  5. poj 1753 Flip Game(bfs状态压缩 或 dfs枚举)

    Description Flip game squares. One side of each piece is white and the other one is black and each p ...

  6. hdoj 5094 Maze 【BFS + 状态压缩】 【好多坑】

    Maze Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Others) Total Sub ...

  7. HDU 3247 Resource Archiver (AC自己主动机 + BFS + 状态压缩DP)

    题目链接:Resource Archiver 解析:n个正常的串.m个病毒串,问包括全部正常串(可重叠)且不包括不论什么病毒串的字符串的最小长度为多少. AC自己主动机 + bfs + 状态压缩DP ...

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

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

  9. hdu 1429(bfs+状态压缩)

    题意:容易理解,但要注意的地方是:如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败.因为这里我贡献了一次wa. 分析:仔细阅读题目之后,会发现最多的钥匙数量为10把,所以把这个作为题目的突破口, ...

  10. UVALive 3956 Key Task (bfs+状态压缩)

    Key Task 题目链接: http://acm.hust.edu.cn/vjudge/contest/129733#problem/D Description The Czech Technica ...

随机推荐

  1. Timus 1149. Sinus Dances 打印复杂公式

    就是打印以下这两个复杂的式子: Let An = sin(1–sin(2+sin(3–sin(4+-sin(n))-) Let Sn = (-(A1+n)A2+n–1)A3+-+2)An+1 For ...

  2. 使用JDK自带的JAXB进行类和xml的互转

    Classroom.java public class Classroom { private int id; private String name; private int grade; publ ...

  3. 整理两个JVM博客集合,空闲时候可以看

    纯洁的微笑写的:https://www.cnblogs.com/ityouknow/p/5614961.html 集合:http://www.cnblogs.com/ityouknow/categor ...

  4. 分离Command

    要点: 1.请求类必须继承CommandBase 2.请求类类名为请求对象中的Key值,大小写可以不区分 3.类必须用public修饰,否则无法识别该请求,提示为无效请求 4.不能再调用NewRequ ...

  5. 转载:在PHP语言中使用JSON和将json还原成数组

    一.json_encode() 1 2 3 4 <?php $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); e ...

  6. jquery serialize对json的包装用法

    jquery对象.serialize()  可以多用于表单对数据封装提交 能够收表参数,形成一个json格式字符串, 前提是:必须为每一个表单项取一个name属性 对元素 设置 name属性, 然后 ...

  7. vi/vim 计算搜寻关键字数量

    http://hi.baidu.com/xletian/blog/item/f19962061a9a506c020881dc.html 在看过 vim 的全域指令和 search 指令之後,你会不会也 ...

  8. Android HTTP通讯

    这里有一个非常棒的http通讯的总结,我看了以后茅塞顿开. 先贴代码: 01 public class Activity1 extends Activity { 02   03     private ...

  9. Oracle游标解析

    本节对Oracle中的游标进行详细讲解. 本节所举实例来源Oracle中scott用户下的emp表dept表: 一.游标: 1.概念: 游标的本质是一个结果集resultset,主要用来临时存储从数据 ...

  10. Python学习笔记015——文件file的常规操作之一(文本文件)

    1 什么是文件 文件是用于数据存储的单位 文件通常用来长期保存数据 读写文件是最常见的I/O操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件的功能都是由操作系统提供的,一般而言,操 ...