【GDOI2015】 推箱子 状态压缩+bfs


请注意$8$是一个美妙的数字
考虑到$8\times 8=64$,而一个unsigned long long是$64$位的,所以考虑用一个$01$状态存储箱子。考虑到箱子能转动,那么四种情况都存一下就可以了。
为了能够快速判断某个位置是否可以放下箱子,我们令$f[i][j]$表示左上角为$(i,j)$,大小为$m\times m$的矩形内的$01$状态。
若箱子可以呆在左上角为$(i,j)$的矩形里,那么箱子的状态值$\&f[i][j]$必然为$0$。
令$dis[i][j][k]$表示箱子当前跑到$(i,j)$,逆时针转动的角度为$k\times90$度的最少步数。
发现这是一个网格图,且边权都是$1$,直接随便转移一下就好了。
时间复杂度:O(4n^2+n^2m)。 但是下方的代码是O(4n^2+n^2m^2)的,似乎问题不大。
#include<bits/stdc++.h>
#define M 2005
#define L unsigned long long
using namespace std;
int INF;
char c[]={},ch[M][M]={};
int n,m,box[][]={},Box[][]={},dis[M][M][]={};
L b[]={},a[M][M]={}; void rotate(){
for(int i=;i<m;i++)
for(int j=;j<m;j++)
Box[m-j-][i]=box[i][j];
for(int i=;i<m;i++)
for(int j=;j<m;j++)
box[i][j]=Box[i][j];
}
L gethash(){
L ans=;
for(int i=;i<m;i++)
for(int j=;j<m;j++)
ans=ans<<|box[i][j];
return ans;
}
L gethash(int x,int y){
L ans=;
for(int i=;i<m;i++)
for(int j=;j<m;j++)
ans=ans<<|(ch[i+x][j+y]=='');
return ans;
} int wx[]={,,,-};
int wy[]={,-,,};
queue<int> qx,qy,qz;
void solve(){
memset(dis,,sizeof(dis));
INF=dis[][][];
dis[][][]=;
qx.push(); qy.push(); qz.push();
while(!qx.empty()){
int x=qx.front(); qx.pop();
int y=qy.front(); qy.pop();
int z=qz.front(),Z; qz.pop(); Z=(z+)&;
if(dis[x][y][z]+<dis[x][y][Z]&&((b[Z]&a[x][y])==)){
qx.push(x); qy.push(y); qz.push(Z);
dis[x][y][Z]=dis[x][y][z]+;
} Z=(z-)&;
if(dis[x][y][z]+<dis[x][y][Z]&&((b[Z]&a[x][y])==)){
qx.push(x); qy.push(y); qz.push(Z);
dis[x][y][Z]=dis[x][y][z]+;
} for(int i=;i<;i++){
int X=x+wx[i],Y=y+wy[i];
if(X<||Y<||X>n-m||Y>n-m) continue;
if(dis[x][y][z]+<dis[X][Y][z]&&(b[z]&a[X][Y])==){
dis[X][Y][z]=dis[x][y][z]+;
qx.push(X); qy.push(Y); qz.push(z);
}
}
}
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<m;i++){
scanf("%s",c);
for(int j=;j<m;j++)
box[i][j]=c[j]-'';
}
for(int i=;i<;i++){
b[i]=gethash();
rotate();
} for(int i=;i<n;i++)
scanf("%s",ch[i]);
for(int i=;i<=n-m;i++)
for(int j=;j<=n-m;j++)
a[i][j]=gethash(i,j); solve(); int minn=INF;
for(int i=;i<;i++)
minn=min(minn,dis[n-m][n-m][i]);
if(minn==INF) cout<<-<<endl;
else cout<<minn<<endl;
}
【GDOI2015】 推箱子 状态压缩+bfs的更多相关文章
- 胜利大逃亡(续)(状态压缩bfs)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- hdu 1254 推箱子(双重bfs)
题目链接 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能 ...
- HDU_1254——推箱子,两次BFS
这题做的一把鼻涕一把泪,果断考虑不周555 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱 ...
- hdu 3681 Prison Break(状态压缩+bfs)
Problem Description Rompire . Now it’s time to escape, but Micheal# needs an optimal plan and he con ...
- 【HDU - 1429】胜利大逃亡(续) (高级搜索)【状态压缩+BFS】
Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开 ...
- 推箱子 (hdu1254)(bfs双重广搜)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission ...
- POJ 1753 Flip Game (状态压缩 bfs+位运算)
Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...
- HDU 5025 Saving Tang Monk 【状态压缩BFS】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Time Limit: 2000/1000 MS (Java/O ...
- POJ - 1324 Holedox Moving (状态压缩+BFS/A*)
题目链接 有一个n*m(1<=n,m<=20)的网格图,图中有k堵墙和有一条长度为L(L<=8)的蛇,蛇在移动的过程中不能碰到自己的身体.求蛇移动到点(1,1)所需的最小步数. 显然 ...
随机推荐
- 2018.10.08 NOIP模拟 斐波那契(贪心+hash/map)
传送门 签到题. 显然是可以贪心分组的,也就是尽量跟当前的分成一组. 这时我们需要判断a[l]+a[r],a[l+1]+a[r]...a[r−1]+a[r]a[l]+a[r],a[l+1]+a[r]. ...
- Web Service测试工具小汇
1..NET WebService Studio 这款工具出自微软内部,最大的优点是可视化很好,不用去看那些XML文件,WebService的基础内容就有XML,但是测试中Case过多,每次测试结果都 ...
- time & datetime 模块
在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime,calendar(很少用,不讲),下面分别来介绍. 在开始之前,首先要说明几点: 一 ...
- Linux 修改 IP地址 和 网关
修改IP地址和网关是很常见的操作,在做相关实验的时候,如果没有设置好,会带来很多不必要的麻烦.. 1. 修改IP地址vi /etc/sysconfig/network-scripts/ifcfg-et ...
- 如何在MAC下安装Myeclipse2015真的很虐心!!!!!!!!!!
最近笔者换了一个新的笔记本,mac pro 因为同学说大公司的web开发都是写在Linux操作系统下的,所以我决定搞一个,但是装软件就是很困难啊!找了大量资料发现都不全,最后,终于搞好了,分享给同样虐 ...
- day14(xml 编写及解析)
编写 xml的组成: 1.文档的声明 <?xml version='1.0' encoding='UTF-8' standalone='yes'> xml 表示标签的名字 encoding ...
- afx_msg解释
以前一直不知道AFX_MSG是什么意思,只是觉得它应该是个消息映射函数,但是具体代表什么意思,会返回一个什么样的值是一点都不清楚,今天查了下资料,把查到的东西放这,以免以后忘了还得再查. 在头文件(D ...
- Hbase和Hive的异同
共同点:1.hbase与hive都是架构在hadoop之上的.都是用hadoop作为底层存储 区别:2.Hive是建立在Hadoop之上为了减少MapReduce jobs编写工作的批处理系统,HBa ...
- hdu 1116 欧拉回路+并查集
http://acm.hdu.edu.cn/showproblem.php?pid=1116 给你一些英文单词,判断所有单词能不能连成一串,类似成语接龙的意思.但是如果有多个重复的单词时,也必须满足这 ...
- 软件工程项目基于java的wc实现
WC软件工程项目JAVA实现博客 github地址:https://github.com/liudaohu/myrepository.git 功能实现 · -w 统计单词数 -c 统计字符数 - ...