最后两题算是这个专题最难的两题了

这题关键是标记数组

我一开始设置的是 四维的  第三维是朝向  第四维是钥匙个数

但是 不同的取法钥匙个数可能会重复   如:取ab钥匙和取ac钥匙都是两枚  导致wa

然后学了状态压缩   用位运算来表示

因为一共十把钥匙  2的十次方才1024   所以开一个1024的数组就行了

int vis[25][25][1025];

当遇到门时   &运算:

if(v.n&(1<<(m1[v.x][v.y]-'A')))
{
vis[u.x][u.y][u.n]=1;
q.push(v);
}

  

遇到钥匙的时候:|运算

v.n=v.n|(1<<(m1[v.x][v.y]-'a'));

太巧妙了

#include<bits/stdc++.h>
using namespace std; char m1[][];
int n,m,sx,sy,ex,ey,t;
int vis[][][]; struct node
{
int x,y,d,n; }; bool inmap(int x,int y)
{
if(x>=&&x<=n&&y>=&&y<=m)return true;
return false; } void bfs()
{
memset(vis,,sizeof(vis));
int dx[]={,,,-};
int dy[]={,,-,};
node u;
u.x=sx;u.y=sy;u.d=;u.n=; queue<node>q;
q.push(u); m1[sx][sy]='.';
while(!q.empty())
{
u=q.front();q.pop();
// printf("%d %d %d %d\n",u.x,u.y,u.d,u.n);
if(u.d<=t-&&m1[u.x][u.y]=='^'){printf("%d\n",u.d);return;} for(int i=;i<;i++)
{
node v=u;
v.x+=dx[i];
v.y+=dy[i];
v.d=v.d+;
if(inmap(v.x,v.y)&&m1[v.x][v.y]!='*'&&vis[v.x][v.y][v.n]==&&v.d<t)
{
if(m1[v.x][v.y]>='a'&&m1[v.x][v.y]<='j')
{
v.n=v.n|(<<(m1[v.x][v.y]-'a'));
vis[u.x][u.y][u.n]=;
q.push(v); } if(m1[v.x][v.y]>='A'&&m1[v.x][v.y]<='J')
{
if(v.n&(<<(m1[v.x][v.y]-'A')))
{
vis[u.x][u.y][u.n]=;
q.push(v);
}
}
if((m1[v.x][v.y]=='^'||m1[v.x][v.y]=='.'))
{q.push(v);vis[v.x][v.y][v.n]=;}
}
}
}
printf("-1\n"); }
int main()
{ while(scanf("%d%d%d",&n,&m,&t)==)
{
getchar();
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{scanf("%c",&m1[i][j]);
if(m1[i][j]=='@'){sx=i;sy=j;}
if(m1[i][j]=='^'){ex=i;ey=j;}
}
getchar();
} bfs(); getchar(); }
return ;
}

回顾:

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 20+5
#define inf 0x3f3f3f3f
int dx[]={,,,-};
int dy[]={,-,,};
int sx,sy,ex,ey,k;
int n,m;
char mp[N][N]; bool inmap(int x,int y)
{
return x>=&&x<=n&&y>=&&y<=m;
} struct node
{
int x,y,d,key;
}; int vis[N][N][<<]; void bfs()
{
memset(vis,,sizeof vis);
node u,v;
u.x=sx;
u.y=sy;
u.d=;
u.key=;
vis[sx][sy][]=;
queue<node>q;
q.push(u);
while(!q.empty())
{
u=q.front();q.pop();
// printf("%d %d %d\n",u.x,u.y,u.d); if(mp[u.x][u.y]=='^'&&u.d<k){printf("%d\n",u.d);return;} for(int i=;i<;i++)
{
node v=u;
v.x+=dx[i];
v.y+=dy[i];
v.d+=;
if(v.d>=k)continue; if(islower(mp[v.x][v.y]))
v.key=v.key|( <<(mp[v.x][v.y]-'a') );
if(isupper(mp[v.x][v.y]))
if(( v.key&(<<(mp[v.x][v.y]-'A')) )== )continue; if(inmap(v.x,v.y)&&mp[v.x][v.y]!='*'&&!vis[v.x][v.y][v.key])
{
q.push(v);
vis[v.x][v.y][v.key]=; } } }
printf("-1\n");
} int main()
{
while(scanf("%d%d%d",&n,&m,&k)==)
{
for(int i=;i<=n;i++)
scanf("%s",mp[i]+); for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(mp[i][j]=='@'){sx=i;sy=j;}
bfs();
}
return ;
}

胜利大逃亡 HDU1429 (bfs)的更多相关文章

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

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

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

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

  3. HDU-1253 胜利大逃亡 (BFS)

    此题可以做为三维深搜模板题.. 胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

  4. HDU1253 胜利大逃亡 (BFS)

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

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

    又开始刷题了 题意:略过. 分析:主要是确定状态量,除了坐标(x,y)之外,还有一个key状态,就好比手上拿着一串钥匙.状态可以用位运算来表示:key&(x,y)表示判断有没有这扇门的钥匙,k ...

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 思路分析:题目要求找出最短的逃亡路径,但是与一般的问题不同,该问题增加了门与钥匙约束条件: 考虑 ...

  7. 九度1456胜利大逃亡【BFS】

    时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:4432 解决:1616 题目描述: Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡 ...

  8. 胜利大逃亡,bfs,广度优先搜索

    题目描述: Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius ...

  9. HDOJ 1253 胜利大逃亡(bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253 思路分析:因为问题需要寻找到达终点的最短的距离(最短的步数),即在状态转换图上需要找出层次最浅的 ...

随机推荐

  1. change丶未来科技公众号成立了!!!!!!!!!

    其实笔者好早之前就开始弄个公众号了,但是出于各种各样的原因,一直被耽搁,现在可以了.总算弄好了,弄个公众号不难,其他原因而已 欢迎大家在Change丶未来科技交流成长. 互联网博文全新模式,分享你我的 ...

  2. 洛谷 P2257 YY的GCD

    洛谷 P2257 YY的GCD \(solution:\) 这道题完全跟[POI2007]ZAP-Queries (莫比乌斯反演+整除分块) 用的一个套路. 我们可以列出答案就是要我们求: \(ans ...

  3. Flask最强攻略 - 跟DragonFire学Flask - 第八篇 实例化Flask的参数 及 对app的配置

    Flask 是一个非常灵活且短小精干的web框架 , 那么灵活性从什么地方体现呢? 有一个神奇的东西叫 Flask配置 , 这个东西怎么用呢? 它能给我们带来怎么样的方便呢? 首先展示一下: from ...

  4. java gc

    mark下来 https://plumbr.eu/handbook/what-is-garbage-collection

  5. 第一次安卓android studio安装,常见问题。

    出处:纸月 托了很久终于开始学习安卓了,之前看课本教程<第一行代码>用的是eclipse,但后来它不支持了就决定用android studio,第一次安装就出现了一些小的问题 第一个是关于 ...

  6. 教你如何使用android studio发布release 版本【转】

    原文链接 想必还有人对如何在Android studio (以下简称as)发布release版本的app而狂刷百度吧?都是过来人,我很理解这种心情,百度到的基本是半成品,为什么这么说呢?百度一下,你就 ...

  7. SpringBoot集成Dubbo

    (1).新建一个普通Maven项目,用于存放一些公共服务接口及公共的Bean等. 项目: 公共Bean: package cn.coreqi.entities; import java.io.Seri ...

  8. MR室内室外用户区分

    mro_view_details_year中v3字段 1:室外用户 0:室内用户 主小区是室内站 主小区信号>-90dBm ==> 室内 主小区信号>-100dBm &&am ...

  9. Python3学习笔记20-获取对象信息

    当我们拿到一个对象的引用时,如何知道这个对象是什么类型.有哪些方法呢? 基本类型都可以用type()判断: print(type(123)) print(type('str')) print(type ...

  10. 【转】snprintf()函数使用方法

    众所周知,sprintf不能检查目标字符串的长度,可能造成众多安全问题,所以都会推荐使用snprintf. 注:sprintf()函数:int sprintf( char *buffer, const ...