hdu 4634 Swipe Bo bfs+状态压缩
状态压缩记录当前拿到了哪些钥匙, 然后暴力搜索。
搞了好几个小时, 一开始也不知道哪里错了, 最后A了也不知道一开始哪里有问题。
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <string>
#include <queue>
#include <stack>
#include <bitset>
using namespace std;
#define pb(x) push_back(x)
#define ll long long
#define mk(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define mem(a) memset(a, 0, sizeof(a))
#define rson m+1, r, rt<<1|1
#define mem1(a) memset(a, -1, sizeof(a))
#define mem2(a) memset(a, 0x3f, sizeof(a))
#define rep(i, n, a) for(int i = a; i<n; i++)
#define fi first
#define se second
typedef pair<int, int> pll;
const double PI = acos(-1.0);
const double eps = 1e-;
const int mod = 1e9+;
const int inf = ;
const int dir[][] = { {-, }, {, }, {, -}, {, } };
const int maxn = ;
int n, m, cnt, g[maxn][maxn];
bool vis[maxn][maxn][<<][], used[maxn][maxn][<<];
char s[maxn][maxn];
struct node
{
int x, y, step, key;
node(){}
node(int _x, int _y, int _step, int _key): x(_x), y(_y), step(_step), key(_key){}
};
queue <node> q;
int check(int x, int y) {
if(x>=&&x<n&&y>=&&y<m)
return ;
return ;
}
int judge(int x, int y) {
if(x == )
return ;
if(x == -)
return ;
if(y == )
return ;
if(y == -)
return ;
}
void bfs(int x, int y) {
mem(vis);
mem(used);
while(!q.empty())
q.pop();
used[x][y][] = ;
q.push(node(x, y, , ));
while(!q.empty()) {
node temp = q.front(); q.pop();
int x = temp.x, y = temp.y, tmpx, tmpy;
for(int i = ; i < ; i++) {
int dirx = dir[i][], diry = dir[i][];
tmpx = x, tmpy = y;
int key = temp.key;
node tmp = temp;
if(!check(tmpx+dirx, tmpy+diry) || s[tmpx+dirx][tmpy+diry]=='#')
continue;
while() {
if(s[tmpx][tmpy] == 'L')
dirx = , diry = -;
if(s[tmpx][tmpy] == 'R')
dirx = , diry = ;
if(s[tmpx][tmpy] == 'U')
dirx = -, diry = ;
if(s[tmpx][tmpy] == 'D')
dirx = , diry = ;
int tmpdir = judge(dirx, diry);
if(vis[tmpx][tmpy][tmp.key][tmpdir])
break;
vis[tmpx][tmpy][tmp.key][tmpdir] = ;
if(s[tmpx][tmpy] == 'E' && key == (<<cnt)-) {
printf("%d\n", temp.step+);
return ;
}
if(s[tmpx][tmpy] == 'K')
key |= g[tmpx][tmpy];
if(check(tmpx+dirx, tmpy+diry)) {
if(s[tmpx+dirx][tmpy+diry] == '#') {
tmp.x = tmpx;
tmp.y = tmpy;
tmp.step++;
tmp.key = key;
q.push(tmp);
used[tmpx][tmpy][tmp.key] = ;
break;
} else {
tmpx += dirx;
tmpy += diry;
}
} else {
break;
}
}
}
}
puts("-1");
return ;
}
void solve() {
cnt = ;
int x, y;
for(int i = ; i < n; i++) {
for(int j = ; j < m; j++) {
if(s[i][j] == 'S')
x = i, y = j;
if(s[i][j] == 'K') {
g[i][j] = <<cnt;
cnt++;
}
}
}
bfs(x, y);
}
void read() {
for(int i = ; i < n; i++)
scanf("%s", s[i]);
}
int main()
{
while(scanf("%d%d", &n, &m)!=EOF) {
read();
solve();
}
return ;
}
hdu 4634 Swipe Bo bfs+状态压缩的更多相关文章
- HDU 4634 Swipe Bo (2013多校4 1003 搜索)
Swipe Bo Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU 1885 Key Task (BFS + 状态压缩)
题意:给定一个n*m的矩阵,里面有门,有钥匙,有出口,问你逃出去的最短路径是多少. 析:这很明显是一个BFS,但是,里面又有其他的东西,所以我们考虑状态压缩,定义三维BFS,最后一维表示拿到钥匙的状态 ...
- hdu 4634 Swipe Bo 搜索
典型的bfs模拟 (广度优先搜索) ,不过有好多细节要注意,比如图中如果是 R# 走到这个R的话就无限往右走了,这样就挂了~肯定到不了出口.还有一种容易造成死循环的,比如 #E## DLLL D. ...
- HDU 4634 Swipe Bo 状态压缩+BFS最短路
将起始点.终点和钥匙统一编号,预处理: 1.起始点到所有钥匙+终点的最短路 2.所有钥匙之间两两的最短路 3.所有钥匙到终点的最短路 将起始点和所有钥匙四方向出发设为起点BFS一遍,求出它到任意点任意 ...
- hdu 4845 : 拯救大兵瑞恩 (bfs+状态压缩)
题目链接 #include<bits/stdc++.h> using namespace std; typedef long long LL; int n,m,p,s,k; ,,,-}; ...
- HDU 3247 Resource Archiver (AC自己主动机 + BFS + 状态压缩DP)
题目链接:Resource Archiver 解析:n个正常的串.m个病毒串,问包括全部正常串(可重叠)且不包括不论什么病毒串的字符串的最小长度为多少. AC自己主动机 + bfs + 状态压缩DP ...
- BFS+状态压缩 hdu-1885-Key Task
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...
- ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))
求一条蛇到(1,1)的最短路长,题目不简单,状态较多,需要考虑状态压缩,ZOJ的数据似乎比POj弱一些 POJ1324(ZOJ1361)-Holedox Moving 题意:一条已知初始状态的蛇,求其 ...
- HDU1429+bfs+状态压缩
bfs+状态压缩思路:用2进制表示每个钥匙是否已经被找到.. /* bfs+状态压缩 思路:用2进制表示每个钥匙是否已经被找到. */ #include<algorithm> #inclu ...
随机推荐
- week 与 strong区别 精辟的解释
转:http://stackoverflow.com/questions/9262535/explanation-of-strong-and-weak-storage-in-ios5 觉得讲的很容易理 ...
- c#中的数据类型简介(枚举)
C#中的数据类型简介(枚举) 枚举的定义 根据MSDN上给出的定义,枚举是一个指定的常数集,其基础类型可以是除Char外的任何整型. 如果没有显式声明基础类型,则使用 Int32. Enum 是 .N ...
- data stage走起
如题,希望以后可以找到相应的工作.(已经工作3年以上了)
- Android——仿QQ聊天撒花特效
实现这样的效果,你要知道贝塞尔曲线,何谓贝塞尔曲线?其实就是曲线,嘿嘿,关于曲线的概念大家可以去 Android绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和 ...
- 关于“找不到附属汇编 Microsoft.VC90.CRT,上一个错误是 参照的汇编没有安装在系统上。”的解决
关于“找不到附属汇编 Microsoft.VC90.CRT,上一个错误是 参照的汇编没有安装在系统上.”的解决 一个项目需要在Win系统用计划任务执行PHP,写了个批处理bat利用php-cgi.ex ...
- 创业青年:刘霞(YBC推荐)_CCTV.com_中国中央电视台
创业青年:刘霞(YBC推荐)_CCTV.com_中国中央电视台 创业青年:刘霞(YBC推荐) CCTV.com 2009年06月23日 09:57 进入复兴论坛 来源:央视网 姓名 ...
- Android UI SurfaceView的使用-绘制单个图型或多个图形
新建MyView类继承自SurfaceView: public class MyView extends SurfaceView implements SurfaceHolder.Callback { ...
- ios 开发 常见问题解决 (持续更新)
1.使用cocoaPods引用第三方类库,报错:file not found . 解决方案:设置 Project->Info->Configurations之后 clear ,然后再 ...
- ProductHunt:创业公司产品猎场和秀场
Product模式介绍 ProductHunt(站点www.producthunt.com)是一个国外新出现的创业公司产品展示和交流平台, 顾名思义.对于创业者而言这里是一个秀场,而对于投资人而言这里 ...
- SQL整理4
--====================简单增删改===========--查看学生表的全部数据select * from studio --插入一个新的学生信息insert into stu ...