hdu 1429 胜利大逃亡(续) bfs+状态压缩
胜利大逃亡(续)
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10137 Accepted Submission(s): 3664
这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。
. 代表路
* 代表墙
@ 代表Ignatius的起始位置
^ 代表地牢的出口
A-J 代表带锁的门,对应的钥匙分别为a-j
a-j 代表钥匙,对应的门分别为A-J
每组测试数据之间有一个空行。
思路:
1.因为有10种不同的钥匙,每种都有两种状态,结合二进制的特点,
刚好把这10把钥匙当成每一个位,要 1<<10 个位保存所有的状态
2.模拟捡起钥匙,捡起钥匙就是说明这个位上的数字变成1状态
所以想到位运算 |,改变这个点的状态
3.模拟碰到门的情况,就和这个位置上的位&一次,
结果是1代表有钥匙,可以开门
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=20+10;
char map[maxn][maxn];
int n,m,t;
bool vis[maxn][maxn][(1<<10)+10];
//状态压缩,最多有10种钥匙
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
struct Point
{int x,y,step;int key;
};
queue<Point>Q;
Point st;
bool check(int x,int y)
{if(x>=1&&x<=n&&y>=1&&y<=m&&map[x][y]!='*')return true;return false;
}
int bfs()
{while(!Q.empty()) Q.pop();memset(vis,false,sizeof(vis));vis[st.x][st.y][st.key]=true;st.key=st.step=0;Q.push(st);Point cur,nex;while(!Q.empty()){cur=Q.front();Q.pop();if(map[cur.x][cur.y]=='^')return cur.step;for(int i=0;i<4;i++){nex.x=cur.x+dx[i];nex.y=cur.y+dy[i];nex.key=cur.key;if(check(nex.x,nex.y)){nex.step=cur.step+1;if(nex.step>=t)continue;else if(map[nex.x][nex.y]>='A'&&map[nex.x][nex.y]<='Z'){int temp=map[nex.x][nex.y]-'A';//int nk=cur.key&(1<<temp);int nk=cur.key&1<<temp;//先左移,后与运算 if(nk&&!vis[nex.x][nex.y][nex.key]){vis[nex.x][nex.y][nex.key]=true;Q.push(nex);}}else if(map[nex.x][nex.y]>='a'&&map[nex.x][nex.y]<='z'){int temp=map[nex.x][nex.y]-'a';//nex.key=cur.key|(1<<temp);nex.key=cur.key|1<<temp;//先左移,后或运算 if(!vis[nex.x][nex.y][nex.key]){vis[nex.x][nex.y][nex.key]=true;Q.push(nex);}}else{if(!vis[nex.x][nex.y][nex.key]){vis[nex.x][nex.y][nex.key]=true;Q.push(nex);}}//else}//if}//for}return -1;
}
inline void read_graph()
{char str[maxn];for(int i=1;i<=n;i++){scanf("%s",str+1);for(int j=1;j<=m;j++){if(str[j]=='@'){st.x=i;st.y=j;map[i][j]=str[j];}else map[i][j]=str[j];}
}
}
int main()
{while(~scanf("%d%d%d",&n,&m,&t)){read_graph();int ans=bfs();printf("%d\n",ans);}return 0;
}
hdu 1429 胜利大逃亡(续) bfs+状态压缩相关推荐
- HDU 1429 胜利大逃亡(续) (BFS+位压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) ...
- HDU - 1429 胜利大逃亡(续) (BFS+状压)
题目链接 思路 因为新拿到一把钥匙所以相同位置可以重复走,一共10把钥匙二进制表示拿到的钥匙,判断下个位置是否可以走. #include <bits/stdc++.h> const int ...
- HDU 1429 胜利大逃亡(续)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- hdu 1429 胜利大逃亡(续)
状态压缩+宽搜 #include<cstdio> #include<iostream> #include<cstring> #include<queue> ...
- BFS——1429 胜利大逃亡(续)
1429 胜利大逃亡(续) 文章目录 1429 胜利大逃亡(续) 题意: 思路: 本题的重点在于标记数组,除了基本的坐标 ( x , y ) (x,y) (x,y)以外,在同一位置是否有某个钥匙显然会 ...
- (HDU1429)胜利大逃亡(续)-BFS-状态压缩
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- hdu 杭电1429 胜利大逃亡(续)
题目表述 Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)-- 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些 ...
- hdu 1253 胜利大逃亡(BFS)
题目链接:点击链接 三维的BFS,刚开始一直超内存,超无语...... 改了n多次终于AC了 #include <iostream> #include <stdio.h> # ...
- HDU-1429 胜利大逃亡(续)
A - 胜利大逃亡(续) Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
最新文章
- TCP三次握手,四次分手
- BT觀念分享和常見問題彙整
- 互联网协议 — Segment Routing(分段路由网络)— SR-MPLS
- JavaScript 回调(callback)函数
- Java-线程间通信小结
- 最简单 - 单例模式
- Nifty JUnit:在方法和类级别上使用规则
- Telnet远程访问思科交换机、路由器
- vsc写vue生成基本代码快捷键_基于vue2.X的webpack基本配置,教你手动撸一个webpack4的配置...
- 【文末送书】调参太费力?自动化机器学习来帮你!
- gitlab ProjectMembers
- 为资产分类定义折旧范围_SAP 固定资产的配置与逻辑 -
- R-数据挖掘 | 聚类分析中的各种相异(似)度计算
- pythonscrapy爬虫_使用Python3和Scrapy进行网站图片爬虫自动下载
- protues7 使用笔记
- Scary Movie 4
- 用python批量修改图片尺寸
- 顶尖文案app_17个文案网站 5款短视频软件,自媒体人必备,直接拿走不谢
- python 查找excel表格中重复的信息并标出来
- Machine learning K-Means课堂笔记
热门文章
- datax调研及增量更新的思路
- 为什么要两次调用encodeURI来解决乱码问题
- react+express+mongodb搭建个人博客
- 用eclispe远程调试tomcat war包形式
- matlab 已知函数值纵坐标值(Y值)获得对应的横坐标
- 一个Eclipse代码显示主题
- hadoop学习01 网址收集
- 一个实用的表格(锁定表头,可调整单元格大小,可排序)
- python3.5安装pillow_Python3.5在Windows 10上安装Pillow时出错
- oracle查询记录插入,我应该使用哪种查询语法在Oracle数据库中插入记录?