Maze
Maze
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5094
BFS+状态压缩
把身上携带钥匙的状态压缩成一个2^10的整数。这道题难在如何表示墙和门所在的位置,我是另开了个两个N*N的数组mp_r[N][N],mp_c[N][N]分别以行和列错位存储存储墙和门的位置(mp_r[i][j]表示第r行j列和第r行j+1列的墙的状态),其他人好像是用mp[N][N][4]来存储墙和门的状态的,突然觉得我好蠢...这题坑点是一个位置可以存多把钥匙(吐血 怪不得这么多次都是WA)= =
代码如下:
#include<cstdio>
#include<queue>
#include<cstring>
#define LL long long
#define N 55
using namespace std;
struct node{
LL x,y,time;
bool key[];
};
node s,e;
LL mp_r[N][N];
LL mp_c[N][N];
LL key[N][N][];
LL n,m,p;
bool mark[][N][N];
bool flag;
LL dx[]={-,,,};
LL dy[]={,,-,};
LL zip(node t){
LL code=;
for(LL i=;i<p;++i)
code=(code<<)|t.key[i];
return code;
}
void init(){
flag=;
s.x=,s.y=,s.time=;
e.x=n,e.y=m,e.time=;
memset(mp_r,-,sizeof(mp_r));
memset(mp_c,-,sizeof(mp_c));
memset(key,,sizeof(key));
memset(mark,,sizeof(mark));
mark[][][]=;
LL k;
scanf("%I64d",&k);
while(k--){
LL x1,y1,x2,y2,g;
scanf("%I64d%I64d%I64d%I64d%I64d",&x1,&y1,&x2,&y2,&g);
if(x1-x2==)mp_r[x1][(y1+y2)/]=g;
else mp_c[(x1+x2)/][y1]=g;
}
scanf("%I64d",&k);
while(k--){
LL x,y,q;
scanf("%I64d%I64d%I64d",&x,&y,&q);
q--;
key[x][y][q]=;
}
for(int i=;i<;i++)
if(key[][][i])s.key[i]=;
}
int main(void){
while(~scanf("%I64d%I64d%I64d",&n,&m,&p)){
init();
queue<node> que;
que.push(s);
while(!que.empty()){
node t=que.front();
que.pop();
if(t.x==e.x&&t.y==e.y){
e.time=t.time;
flag=;
break;
}
for(LL i=;i<;++i){
LL x=t.x+dx[i];
LL y=t.y+dy[i];
if(<=x&&x<=n&&<=y&&y<=m){
node temp;
temp.x=x,temp.y=y,temp.time=t.time+;
for(LL j=;j<p;++j)temp.key[j]=t.key[j];
for(int j=;j<;j++)
if(key[x][y][j])temp.key[j]=;
if(dx[i]){
if(mp_c[(x+t.x)/][y]!=)
if(mp_c[(x+t.x)/][y]==-||temp.key[mp_c[(x+t.x)/][y]-]){
LL key_zip=zip(temp);
if(!mark[key_zip][x][y]){
mark[key_zip][x][y]=;
que.push(temp);
}
}
}else if(dy[i]){
if(mp_r[x][(y+t.y)/]!=)
if(mp_r[x][(y+t.y)/]==-||temp.key[mp_r[x][(y+t.y)/]-]){
LL key_zip=zip(temp);
if(!mark[key_zip][x][y]){
mark[key_zip][x][y]=;
que.push(temp);
}
}
}
}
}
}
if(flag)printf("%I64d\n",e.time);
else printf("-1\n");
}
}
Maze的更多相关文章
- Backtracking algorithm: rat in maze
Sept. 10, 2015 Study again the back tracking algorithm using recursive solution, rat in maze, a clas ...
- (期望)A Dangerous Maze(Light OJ 1027)
http://www.lightoj.com/volume_showproblem.php?problem=1027 You are in a maze; seeing n doors in fron ...
- 1204. Maze Traversal
1204. Maze Traversal A common problem in artificial intelligence is negotiation of a maze. A maze ...
- uva705--slash maze
/*这道题我原本是将斜线迷宫扩大为原来的两倍,但是在这种情况下对于在斜的方向上的搜索会变的较容易出错,所以参考了别人的思路后将迷宫扩展为原来的3倍,这样就变成一般的迷宫问题了*/ #include&q ...
- HDU 4048 Zhuge Liang's Stone Sentinel Maze
Zhuge Liang's Stone Sentinel Maze Time Limit: 10000/4000 MS (Java/Others) Memory Limit: 32768/327 ...
- Borg Maze(MST & bfs)
Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9220 Accepted: 3087 Descrip ...
- poj 3026 bfs+prim Borg Maze
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9718 Accepted: 3263 Description The B ...
- HDU 4035:Maze(概率DP)
http://acm.split.hdu.edu.cn/showproblem.php?pid=4035 Maze Special Judge Problem Description When w ...
- POJ 3026 : Borg Maze(BFS + Prim)
http://poj.org/problem?id=3026 Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions ...
- Borg Maze 分类: POJ 2015-07-27 15:28 5人阅读 评论(0) 收藏
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9971 Accepted: 3347 Description The B ...
随机推荐
- 【转】关于python中re模块split方法的使用
注:最近在研究文本处理,需要用到正则切割文本,所以收索到了这篇文章,很有用,谢谢原作者. 原址:http://blog.sciencenet.cn/blog-314114-775285.html 关于 ...
- 多目标遗传算法 ------ NSGA-II (部分源码解析)介绍
NSGA(非支配排序遗传算法).NSGA-II(带精英策略的快速非支配排序遗传算法),都是基于遗传算法的多目标优化算法,是基于pareto最优解讨论的多目标优化. 在官网: http://www.ii ...
- java转发和重定向
1,请求重定向:客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保持,地址栏的URL地址会改变.2,请求转发:服务器行为,request.ge ...
- IntelliJ IDEA中类似Eclipse自动补全变量名称和属性名称的快捷键
IntelliJ IDEA 默认快捷键模式下 自动补全变量名称 : Ctrl + Alt + v 自动补全属性名称 : Ctrl + Alt + f
- SDN理解:目录
为什么? 最近一直在学习SDN方面的知识,本着"最好的学习就是分享"的精神,记录下本系列的文章,尝试更好地去理解SDN这一正当红的技术. 如何? SDN领域现在已经充斥了大量的公司 ...
- VS2010下调试.NET源码
微软走向开源,是时候用vs去单步调试进入源码了.参考地址:http://blog.csdn.net/waxgourd0/article/details/6600182 可供参考的文章:https:// ...
- CentOS 7安装Teamviewer 12
1 下载teamviewer 12的rpm包 方法一:访问官网 https://www.teamviewer.com/en/download/linux/ 方法二:wget https://downl ...
- Spring in Action --- 使用MockMvc时报异常
今天在学习spring时模仿了书上的代码编写基于mockmvc的测试用例,但是运行时报 Error:(8, 8) java: 无法访问javax.servlet.ServletException ...
- iOS GCD基础篇 - 同步、异步,并发、并行的理解
1.关于GCD - GCD全称是Grand Central Dispatch - GCD是苹果公司为多核的并行运算提出的解决方案 - GCD会自动利用更多的CPU内核(比如双核.四核) - GC ...
- springmvc获取jar中的静态资源与jar包中的资源互相引用问题
1.首先看jar中的文件位置 2.在web工程中引用该jar 并且在springmvc文件中配置路径 如果有多个路径可用逗号隔开 3.在web工程找jsp页面如何引用 这样就可以了 关于jar中的资源 ...