http://acm.hdu.edu.cn/showproblem.php?pid=1429

典型的状压搜索,在普通的搜索基础上,利用二进制的特性记录钥匙与门, 二进制的每一位代表一把钥匙,比如说拿到了2号钥匙

那么原有的00000变为了00010,当到大了对应的二号门的时候,利用位运算00010来&上1<<2也就是00010就是非0,如果不是二号门的时候

那么00010&上1<<x都是0,所以此时其它门都进不去,如果再拿到了三号钥匙加上之后变成了00110,代表二号三号钥匙都拿到了,然后到了三号门的

时候00110&(1<<3)00100或者到了二号门的时候00110&(1<<2)00010都是非0的,到其他门都是为0的-----

这样就很好的解决了钥匙的记录问题,这里有10把钥匙,所以数组要大于2的10次方

code

 #include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int dx[]={,-,,};
int dy[]={,,-,};
char dzm[]={'A','B','C','D','E','F','G','H','I','J'};
char xzm[]={'a','b','c','d','e','f','g','h','i','j'};
struct point {
int x,y;
int step,dir;
};
int n,m,sx,sy;
int visit[][][];//记录钥匙
char map[][];
int bfs()
{
int i,j;
memset(visit,,sizeof(visit));
queue<point>Q;
point now,next;
now.x=sx;now.y=sy;
now.step=now.dir=;
visit[now.x][now.y][now.dir]=;
Q.push(now);
while (!Q.empty())
{
now=Q.front();
Q.pop();
if (map[now.x][now.y]=='^')
return now.step;
for (i=;i<;i++)
{
next.x=now.x+dx[i];
next.y=now.y+dy[i];
next.step=now.step+;
next.dir=now.dir;
if (map[next.x][next.y]=='*')continue;
if (next.x<||next.x>n||next.y<||next.y>m)continue;
if (map[next.x][next.y]<='J'&&map[next.x][next.y]>='A')
{
for (j=;j<;j++)
{
if (map[next.x][next.y]==dzm[j])
{
if ((next.dir&(<<j))!=)
{
if (visit[next.x][next.y][next.dir]==)
{
visit[next.x][next.y][next.dir]=;
Q.push(next);
}
}
}
}
}
else if (map[next.x][next.y]<='j'&&map[next.x][next.y]>='a')
{
for (j=;j<;j++)
{
if (map[next.x][next.y]==xzm[j])
{
if ((next.dir&(<<j))==)
next.dir+=(<<j);
if (visit[next.x][next.y][next.dir]==)
{
visit[next.x][next.y][next.dir]=;
Q.push(next);
}
}
}
}
else
{
if (visit[next.x][next.y][next.dir]==)
{
visit[next.x][next.y][next.dir]=;
Q.push(next);
}
}
}
}
return -;
}
int main()
{
int i,j,t;
while (~scanf("%d %d %d",&n,&m,&t))
{
getchar();
for (i=;i<=n;i++)
{
for (j=;j<=m;j++)
{
scanf(" %c",&map[i][j]);
if (map[i][j]=='@')
sx=i,sy=j;
}
}
int q=bfs();
if (q>=t)
printf("-1\n");
else
printf("%d\n",q);
}
return ;
}

hdu 1429 (bfs+状态压缩) 胜利大逃亡续的更多相关文章

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

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

  2. HDU 1429 胜利大逃亡(续)(bfs+状态压缩,很经典)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  3. hdoj 1429 胜利大逃亡(续) 【BFS+状态压缩】

    题目:pid=1429">hdoj 1429 胜利大逃亡(续) 同样题目: 题意:中文的,自己看 分析:题目是求最少的逃亡时间.确定用BFS 这个题目的难点在于有几个锁对于几把钥匙.唯 ...

  4. hdu 1429 胜利大逃亡(续)(bfs+位压缩)

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

  5. HDU 1429 胜利大逃亡(续)(DP + 状态压缩)

    胜利大逃亡(续) Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢 ...

  6. 胜利大逃亡(续)(状态压缩bfs)

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

  7. 胜利大逃亡(续)(bfs+状态压缩)

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

  8. hdu.1429.胜利大逃亡(续)(bfs + 0101011110)

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

  9. HDU 1429 胜利大逃亡(续)(bfs)

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

随机推荐

  1. 吴裕雄 python 爬虫(1)

    from urllib.parse import urlparse url = 'http://www.pm25x.com/city/beijing.htm' o = urlparse(url) pr ...

  2. tensorflow 之tensorboard 对比不同超参数训练结果

    我们通常使用tensorboard 统计我们的accurate ,loss等,并绘制曲线,通常是使用一次训练中的, 但是,机器学习中通常要对比不同的 ‘超参数’给模型训练和预测能力的不同这时候如何整合 ...

  3. vue--公告轮播

    html:   <div class="news" v-if="news.length > 0" > <ul class="m ...

  4. PowerDesigner导入sql脚本生成物理模型

    https://www.cnblogs.com/zsswpb/p/5771623.html

  5. Ubuntu系统下手动释放内存

    有时候,像mongo这种,对内存只吃不吐的,我们要手动释放一下. drop_caches的详细文档如下:Writing to this will cause the kernel to drop cl ...

  6. ECharts-初始化方法参数不能传入jquery对象

    ECharts-初始化方法参数不能传入jquery对象

  7. Activity 与 Task

    [Activity 与 Task] A task is a collection of activities that users interact with when performing a ce ...

  8. PHP 在 Mac 的安装之路

    半年前本以为有一些 Apache 和 PHP 的安装经验,今天在 Mac 上还是踩了很多坑. 坦诚地讲,这东西入门成本比 Node,Python 入门成本真的是大很多. Apache 的编译安装就是那 ...

  9. Oracle中Null与空字符串' '的区别

    含义解释: 问:什么是NULL? 答:在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零. ORACLE允许任何一种数据类型的字段为空,除 ...

  10. java面试题:Linux

    Q:Linux怎么查端口?端口被占用怎么办? netstat -ntulp | grep 2181//查看2181端口号 netstat -pan | grep 2181 //查看2181端口号 如下 ...