胜利大逃亡 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 思路分析:因为问题需要寻找到达终点的最短的距离(最短的步数),即在状态转换图上需要找出层次最浅的 ...
随机推荐
- linux系统--磁盘管理命令(一)
一.基本命令 1.1 查看磁盘分区使用状况:df 参数: l:仅显示本地磁盘(默认) a:显示所有文件系统的磁盘使用情况,包括比如 /proc/ h:以1024进制计算最合适的单位显示磁盘容量 H:以 ...
- python技巧 列表推导
val = [expression for value in collection if condition] 等价于 val = []for value in collection: if c ...
- mysql 原理 ~ 常规锁
一 模式 RR模式二 mysql锁相关场景 1 有间隙的地方就可能有间隙锁,并非只有辅助索引的场景下才会存在gap lock,典型场景 id主键的范围查询 2 varchar的范围锁定原理和int ...
- java Comparable 和 Comparator接口区别
Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着“该类支持排序”. 即然实现Comparable接口的类支持排序,假设现在存在“实现C ...
- nginx反向代理实现前后端分离&跨域问题
1.代理和跨域 1.1 正向代理 1)用户希望代理服务器帮助其和要访问服务器之间实现通信,需要: a.用户IP报文的目的IP=代理服务器IP: b.用户报文端口号=代理服务器监听端口号: c.HTTP ...
- oracle_使用子查询创建表
create table emp_bk as (select * from emp where 1=2);这句就是复制源表的结构
- Kernel 3.0.8 内存管理函数【转】
转自:http://blog.csdn.net/myarrow/article/details/7208777 1. 内存分配函数 相关代码如下: #define alloc_pages(gfp_ma ...
- input 子系统架构总结【转】
Linux输入子系统(Input Subsystem) 转自:http://blog.csdn.net/lbmygf/article/details/7360084 Linux 的输入子系统不仅支持鼠 ...
- 汇编语言转换成c语言,或者汇编语言转换成golang的汇编,c语言转换成golang的方法
https://github.com/minio/c2goasm http://microapl.com/asm2c/index.html 收费的 https://gith ...
- scrapy通过修改配置文件发送状态邮件
EXTENSIONS = { 'scrapy.extensions.statsmailer.StatsMailer': 500,} STATSMAILER_RCPTS = ['159882826 ...