思路:有十个门,有十把钥匙,每把钥匙对应一个门,相同的门可以有多个。这样,我们就得按照状态来搜索,用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. Nginx日志分析利器之GoAccess

    1.介绍GoAccess 是一个用来统计 Apache Web 服务器的访问日志的工具,可即时生成统计报表,速度非常快 查看的统计信息有: 统计概况,流量消耗等 访客排名 动态Web请求 静态web请 ...

  2. Flyod 算法(两两之间的最短路径)

    Flyod 算法(两两之间的最短路径)动态规划方法,通过相邻矩阵, 然后把最后的结果存在这么一个矩阵里面,(i,j), #include <iostream> #include <v ...

  3. 在python中使用静态方法staticmethod

    静态方法: 静态方法是类中的函数,不需要实例.静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互,即在静态方法中,不会涉及到类中的方法和属性的操作.可以理解为将静态方法存在 ...

  4. CoreData数据库升级

    如果IOS App 使用到CoreData,并且在上一个版本上有数据库更新(新增表.字段等操作),那在覆盖安装程序时就要进行CoreData数据库的迁移,具体操作如下: 1.选中你的mydata.xc ...

  5. python练习笔记——编写一个装饰器,模拟登录的简单验证

    编写一个装饰器,模拟登录的简单验证(至验证用户名和密码是否正确) 如果用户名为 root 密码为 123则正确,否则不正确.如果验证不通过则不执行被修饰函数 #编写一个装饰器,模拟登录的简单验证 #只 ...

  6. Python多线程之线程创建和终止

    python主要是通过thread和threading这两个模块来实现多线程支持. python的thread模块是比較底层的模块,python的threading模块是对thread做了一些封装,能 ...

  7. Python 列表 count() 方法

    描述 Python 列表 count() 方法用于统计某个元素在列表中出现的次数. 语法 count() 方法语法: L.count(obj) 参数 obj -- 列表中统计的对象. 返回值 返回元素 ...

  8. redis 基本概览

    1 redis 支持5种数据类型.redis 的值是字节数组,所以他不关心具体存储的是什么. redis 的键可以是 数值 strings lists sets hashes Redis 支持诸如列表 ...

  9. js替换iframe的内容

    使用如下方法可以替换页面中iframe里面的内容: for (var i=0; i<window.parent.frames.length; i++) { //window.parent.fra ...

  10. MySql按字段分组取最大值记录

    数据库原始数据如下:数据库名:tbl_clothers 需求是:按照type分组,并获取个分组中price中的最大值,解决sql如下: 方法一: select * from (select type, ...