胜利大逃亡 HDU1429 (bfs)
最后两题算是这个专题最难的两题了
这题关键是标记数组
我一开始设置的是 四维的 第三维是朝向 第四维是钥匙个数
但是 不同的取法钥匙个数可能会重复 如:取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)的更多相关文章
- hdu.1429.胜利大逃亡(续)(bfs + 0101011110)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- hdu 1429 胜利大逃亡(续)(bfs+位压缩)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- HDU-1253 胜利大逃亡 (BFS)
此题可以做为三维深搜模板题.. 胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- HDU1253 胜利大逃亡 (BFS)
胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- hdu 1429 胜利大逃亡(续) (bfs+状态压缩)
又开始刷题了 题意:略过. 分析:主要是确定状态量,除了坐标(x,y)之外,还有一个key状态,就好比手上拿着一串钥匙.状态可以用位运算来表示:key&(x,y)表示判断有没有这扇门的钥匙,k ...
- HDOJ 1429 胜利大逃亡(续) (bfs+状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 思路分析:题目要求找出最短的逃亡路径,但是与一般的问题不同,该问题增加了门与钥匙约束条件: 考虑 ...
- 九度1456胜利大逃亡【BFS】
时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:4432 解决:1616 题目描述: Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡 ...
- 胜利大逃亡,bfs,广度优先搜索
题目描述: Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius ...
- HDOJ 1253 胜利大逃亡(bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253 思路分析:因为问题需要寻找到达终点的最短的距离(最短的步数),即在状态转换图上需要找出层次最浅的 ...
随机推荐
- Unity3d跨平台原理
知乎的一个提问:unity3d跨平台原理 一些资料: IL IL是.NET框架中中间语言(Intermediate Language)的缩写.使用.NET框架提供的编译器可以直接将源程序编译为.exe ...
- Docker入门03——Container
1 启动容器 1.1 新建并启动 1.2 启动已终止容器 2 后台运行 3 终止 4 进入容器 5 导入和导出 5.1 导出 5.2 导入 6 删除 1 启动容器 1.1 新建并启动 docker r ...
- 堆叠窗口QStackedWidget
经常将QStackedWidget和QListWidget或者QListView搭配使用 import sys from PyQt5.QtWidgets import QApplication, QW ...
- QMouseEvent鼠标事件
Qt中的QMouseEvent一般只涉及鼠标左键或右键的单击.释放等操作,而对鼠标滚轮的响应则通过QWheeEvent来处理
- luogu P1593 因子和
不要吐槽博主总做这些数论氵题 首先我们看到这种因数问题,果断质因数分解 所以当前数\(a=p_1^{k_1}*p_2^{k_2}...*p_m^{k_m}\) 可得\(a^b=p_1^{k_1*b}* ...
- 【IT界的厨子】酱香鲈鱼
食材: 前世曾经回眸的鲈鱼一条(主要选刺少的鱼,适合孩子吃,大人吃随意,草鱼比较大) 五花肉少许(肥一些的) 豆腐 辅料: 葱姜 蒜(选) 大料 香菜 调味: 啤酒(两罐) 黄豆酱或豆瓣酱(选) 老抽 ...
- TCP网络协议通信原理(客户端和服务器端)
下面直接用代码来说明TCP协议的基础知识: 服务器端代码块: from socket import * from time import ctime ''' 指定主机地址.工作端口号.接收缓存的长度 ...
- mysql gtid 第一篇
GTID1 简介 就是全局事务ID(global transaction identifier )2 构成 uuid+transaction_id 3 格式 7a07cd08-ac1b-11 ...
- js获取对象的最后一个
Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-i ...
- 论文笔记系列-Simple And Efficient Architecture Search For Neural Networks
摘要 本文提出了一种新方法,可以基于简单的爬山过程自动搜索性能良好的CNN架构,该算法运算符应用网络态射,然后通过余弦退火进行短期优化运行. 令人惊讶的是,这种简单的方法产生了有竞争力的结果,尽管只需 ...