胜利大逃亡 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 - find 查找
# linux文件无创建时间 # Access 使用时间 # Modify 内容修改时间 # Change 状态改变时间(权限.属主) # 时间默认以24小时为单位,当前时间到向前24小时为0天,向前 ...
- Python之print(args)与sys.stdout.write(string)使用总结
一.sys.stdout.write(string) import sys; # sys.stdout.write(): # 1.默认不换行 # 2.参数必须是字符串 # demo 01 x = &q ...
- Linux 流量控制总结(TC)
TC对带宽的描述: mbps = 1024 kbps = 1024 * 1024 bps => byte/s mbit = 1024 kbit => kilo bit/s. ...
- Centos7下编译CDH版本hadoop源码支持Snappy压缩
1 下载snappy包并编译 wget https://github.com/google/snappy/releases/download/1.1.3/snappy-1.1.3.tar.gz tar ...
- HTTP状态码解析
HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码.它由 RFC 2616 规范定义的,并得到RFC 2518.RFC 2817.RFC 2295.R ...
- cell下载图片的思路 --无沙盒(内存)缓冲
// // ViewController.m // 06-表格图片下载 // // Created by jerry on 15/9/7. // Copyright (c) 2015年 jerry. ...
- 【CXF】com.sun.xml.internal.ws.fault.ServerSOAPFaultException: Client received SOAP Faul
在客户端生成代码之后测试出现错误: com.sun.xml.internal.ws.fault.ServerSOAPFaultException: Client received SOAP Faul ...
- kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 【转】
转自:http://blog.chinaunix.net/uid-26349264-id-4455634.html 目录 kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 ...
- Child Process模块
目录 exec() execSync() execFile() spawn() fork() send() 参考链接 child_process模块用于新建子进程.子进程的运行结果储存在系统缓存之中( ...
- 【转】如何安装JDK以及配置Java运行环境
具体的参考这篇博文就好了~~!http://www.cnblogs.com/liu-en-ci/p/6743106.html