hdu1429胜利大逃亡(bfs)
胜利大逃亡(续)
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9204 Accepted Submission(s):
3327
这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。
.
代表路
* 代表墙
@ 代表Ignatius的起始位置
^ 代表地牢的出口
A-J 代表带锁的门,对应的钥匙分别为a-j
a-j
代表钥匙,对应的门分别为A-J
每组测试数据之间有一个空行。
@A.B.
a*.*.
*..*^
c..b*
4 5 16
@A.B.
a*.*.
*..*^
c..b*
-1
/*
把这10把钥匙当成每一个为,要要1<<10个位保存所有的状态,
然后就是模拟捡起钥匙,捡起钥匙就是说明这个位上的数字变成1这个状态,
只要|一下就好了,然后改变在这个点的状态。。。。模拟碰到门的情况,
那么就和这个位置上的位&一次,看是1还是0,1代表已经捡到了这把钥匙,可以开门
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue> #define N 30 using namespace std;
char map[N][N],str[N];;
int n,m,t;
bool vis[N][N][(<<)];
int dx[]= {-,,,};
int dy[]= {,,-,};
struct node
{
int x,y,step,key;
}st;
queue<node>Q; bool check(int x,int y)
{
if(x>=&&x<=n&&y>=&&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=;Q.push(st);
node cur,nex;
while(!Q.empty())
{
cur=Q.front();Q.pop();
if(map[cur.x][cur.y]=='^')return cur.step;
for(int i=; i<; i++)
{
nex.x=cur.x+dx[i];nex.y=cur.y+dy[i];
nex.key=cur.key;
if(!check(nex.x,nex.y)) continue;
nex.step=cur.step+;
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 K=cur.key&<<temp;
if(K && !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|<<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);
}
}
}
}return -;
} inline void init()
{
for(int i=;i<=n;i++)
{
scanf("%s",str+);
for(int j=;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))
{
init();
int ans=bfs();
printf("%d\n",ans);
}
return ;
}
hdu1429胜利大逃亡(bfs)的更多相关文章
- HDOJ1253 胜利大逃亡 BFS
胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...
- HDU1253 胜利大逃亡 BFS
胜利大逃亡 Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submiss ...
- HDU1253 胜利大逃亡(BFS) 2016-07-24 13:41 67人阅读 评论(0) 收藏
胜利大逃亡 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示 ...
- Hdu1429 胜利大逃亡(续) 2017-01-20 18:33 53人阅读 评论(0) 收藏
胜利大逃亡(续) Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Subm ...
- 搜索专题: HDU1429胜利大逃亡
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- hdu1429 胜利大逃亡(续) 【BFS】+【状态压缩】
题目链接:https://vjudge.net/contest/84620#problem/K 题目大意:一个人从起点走到终点,问他是否能够在规定的时间走到,在走向终点的路线上,可能会有一些障碍门,他 ...
- HDU1429 胜利大逃亡 状压bfs
http://acm.hdu.edu.cn/viewcode.php?rid=22225154 因为总共a-j有10种钥匙,所以可以把有没有钥匙的状态压到一个int数里,然后dfs. 昨天状态特别不好 ...
- HDU 1253 胜利大逃亡(BFS)
题目链接 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A ...
- 胜利大逃亡 BFS
Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0 ...
随机推荐
- tac
功能说明:反向显示文件内容. 参数选项: -b 在行前而非行尾加分隔标志. -r 将分隔标志视作正则表达式来解析. -s 使用指定字符串代替换行作为分隔标志. cat命令与tac命令的对比:
- appium 使用send_keys方法时报错: driver.find_element_by_id("com.hmkx.zgjkj:id/layout_search_bar_input").send_keys("123")
新手 使用send_keys方法时一直报错,上网查这个方法的用法,看着大家都是这么写的啊,后来直接搜索 报错信息,搜索结果的针对性就清楚多了. 原来是seleium版本太高导致的问题. 可以先在cmd ...
- DOCKER - 容器抓包
https://help.aliyun.com/knowledge_detail/40564.html?spm=a2c4e.11153940.blogcont272172.10.b09e28a6AOd ...
- HDU 2451 Simple Addition Expression(找规律,考验智商)
题目 最近比赛的题目好多签到题都是找规律的考验智商的题目啊,,,我怎么越来越笨了,,,, 通过列举,可以发现规律: 从左往右按位扫这个数: 当数的长度大于1时: 当首位大于3时,答案就是4*4*4*… ...
- 使用jquery将表单自动封装成json对象 /json对象元素的添加删除和转换
$.fn.serializeObject = function () { var o = {}; var a = this.serializeArray(); $.each(a, function ( ...
- 洛谷——P1183 多边形的面积
P1183 多边形的面积 多边形求面积公式: $\frac {\sum_{i=0}^{n-1}(x_iy_{i+1}-y_ix_{i+1})}{2}$ #include<bits/stdc++. ...
- 57 和为S的数字
题目一:和为S的两个数字 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小 ...
- jdk8--十大新特性
https://www.cnblogs.com/dennyzhangdd/p/6722445.html 一.十大特性 1.Lambda表达式 2.Stream函数式操作流元素集合 3.接口新增:默认方 ...
- 《hello-world》第八次团队作业:Alpha冲刺-Scrum Meeting 4
项目 内容 这个作业属于哪个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十二 团队作业8:软件测试与Alpha冲刺 团队名称 <hello--worl ...
- 【codeforces 515D】Drazil and Tiles
[题目链接]:http://codeforces.com/contest/515/problem/D [题意] 给你一个n*m的格子; 然后让你用1*2的长方形去填格子的空缺; 如果有填满的方案且方案 ...