hdu1429 胜利大逃亡(续)???天天逃亡???
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1429/
题目就是迷宫问题的变种,给出一张地图,上面分布着钥匙和门,一种要是只能开一种特定的门,给出起点和终点,问在t时间内是否能够走到终点。这个问题显然是要用bfs解决,但是状态量除了位置之外还有钥匙,持有的钥匙不同到达同一个位置也是状态空间中的一种不同的状态,所以用三维记录状态,状态的记录可以用二进制进行状态压缩,毕竟钥匙只有有和无两种状态。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a))
#define prime1 1e9+7
#define prime2 1e9+9
#define pi 3.14159265
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define scand(x) scanf("%llf",&x)
#define f(i,a,b) for(int i=a;i<=b;i++)
#define scan(a) scanf("%d",&a)
#define dbg(args) cout<<#args<<":"<<args<<endl;
#define inf 0x3f3f3f3f
#define maxn 25
int n,m,t;
char Map[maxn][maxn];
int sx,sy,tx,ty;
bool vis[maxn][maxn][(<<)];//钥匙最多是2^10-1种状态
int dir[][]={,,,-,,,-,};
struct node{
int x,y,step;
int key;//钥匙也是一种状态,所以考虑状态压缩存储有限的钥匙的状态
node(int x,int y,int s,int key):x(x),y(y),step(s),key(key){}
node(){}
};
node cur,nxt;
int bfs()
{
queue<node>q;//选择队列这种结构在于队列前面的结点step值小,step是连续变化的值
q.push(node(sx,sy,,));
vis[sx][sy][]=;
while(!q.empty())
{
cur=q.front();
q.pop();
if(cur.x==tx&&cur.y==ty&&cur.step<t)
{
return cur.step;
}
f(i,,)
{
nxt=cur;
nxt.x+=dir[i][];
nxt.y+=dir[i][];
nxt.step++;
if(nxt.x<||nxt.x>n||nxt.y<||nxt.y>m||Map[nxt.x][nxt.y]=='*')continue;
if(vis[nxt.x][nxt.y][nxt.key])continue;//相对于非门非钥匙的位置,首先判断是否已经入队
char c=Map[nxt.x][nxt.y];
if(c>='a'&&c<='j')
{
nxt.key|=(<<(c-'a'));//用二进制将状态压缩进每一位中
if(vis[nxt.x][nxt.y][nxt.key])continue;
}
if(c>='A'&&c<='J')
{
if(!(nxt.key&(<<(c-'a'))))continue;//遇到门的时候钥匙的状态不会改变,所以不必重复检查状态是否发生变化
}
vis[nxt.x][nxt.y][nxt.key]=;//上面筛选掉所有不能入队的状态,剩余的状态都必须进队
q.push(nxt);
}
}
return -;
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
std::ios::sync_with_stdio(false);
while(scanf("%d%d%d",&n,&m,&t)!=EOF)
{
mem(vis,false);
f(i,,n)
f(j,,m)
{
scanf(" %c",&Map[i][j]);
if(Map[i][j]=='@')sx=i,sy=j;
if(Map[i][j]=='^')tx=i,ty=j;
}
pf("%d\n",bfs());
}
}
hdu1429 胜利大逃亡(续)???天天逃亡???的更多相关文章
- Hdu1429 胜利大逃亡(续) 2017-01-20 18:33 53人阅读 评论(0) 收藏
胜利大逃亡(续) Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Subm ...
- hdu1429胜利大逃亡(bfs)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- 搜索专题: 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:胜利大逃亡(续)
传送门 题意 给出一个迷宫,门需要钥匙来打开,t秒内能否从起点到达终点 分析 这题我用以前一道题的代码改了改就过了,具体思想:设置vis[status][x][y],status记录到达该点拥有的钥匙 ...
- HDU1429 胜利大逃亡 状压bfs
http://acm.hdu.edu.cn/viewcode.php?rid=22225154 因为总共a-j有10种钥匙,所以可以把有没有钥匙的状态压到一个int数里,然后dfs. 昨天状态特别不好 ...
- 胜利大逃亡(续)hdu1429(bfs)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- hdu.1429.胜利大逃亡(续)(bfs + 0101011110)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- hdu 1429 胜利大逃亡(续)
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王 ...
随机推荐
- mingster.com
Good to Great: Why Some Companies Make the Leap... and Others Don'tby Jim Collinshttp://rcm.amazon.c ...
- 张益肇:AI 医疗,微软有哪些布局?
编者按:近几年来,医疗和人工智能碰撞出了相当多的火花,大量资金短期投入到医疗领域当中.然而在微软亚洲研究院副院长张益肇博士看来,人工智能医疗是一场持久战,大家一定要沉下心多调研.多思考.多学习. 人工 ...
- JAVA补0--->String.format()的使用
详细地址:http://blog.csdn.net/lonely_fireworks/article/details/7962171/ 标 志 说 明 示 例 结 果 + 为正 ...
- C++扬帆远航——15(项目二,太乐了)
/* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:tailezhanshi.cpp * 作者:常轩 * 微信公众号 ...
- MYSQL对数据库和表的基本操作
CREATE DATABASE testdb CHARSET=UTF8 创建一个数据库 名字叫做testdb USE testdb; 选择数据库 CREATE TABLE testTable1( ) ...
- .Net Core中使用ExceptionFilter
.Net Core中有各种Filter,分别是AuthorizationFilter.ResourceFilter.ExceptionFilter.ActionFilter.ResultFilter. ...
- 成长日记(2) Java面向对象
本篇主要是记录自己在学习路上的笔记,如果有哪里记错了请大家直接指出 面向对象的概念 *人为抽象的一种编程模型 *面向过程 代码集中 难以维护 *类:对事物 算法 逻辑 概念等的抽象 理解成 模板 图纸 ...
- springmvc两种配置方法
基于配置文件xml方式, 配置springmvc步骤: 1.在pom文件中引入jar包: <!--导入springmvc的jar包--> <dependency> <gr ...
- Chrome 插件安装时报错: "CRX_HEADER_INVALID"
1. 将 crx 插件后缀名改为 rar 2. 解压 rar 包 3. 进入浏览器 1). 点击Chrome浏览器地址栏最右边的三个点 --> 更多工具 --> 扩展插件 --> 点 ...
- 设计模式-11享元模式(Flyweight Pattern)
1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...