【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)所需的最小步数. 显然 ...
随机推荐
- 【DBCP】DBCP基本配置和重连配置+spring中配置
最近在看一些dbcp的相关内容,顺便做一下记录,免得自己给忘记了. 1. 引入dbcp (选择1.4) <dependency> <groupId>com.alibaba. ...
- 20155333 2016-2017-2 《Java程序设计》第五周学习总结
20155333 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 1.使用try.catch语法 与C语言中程序流程和错误处理混在一起不同,Java中把正常流 ...
- Spring3.x错误---- Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.
Spring3.x错误: 解决方法: 缺少cglib的包, 下载地址: http://sourceforge.net/projects/cglib/files/latest/download?sour ...
- web.xml 404 500 配置
web.xml <error-page> <error-code>404</error-code> <location>/error404.html&l ...
- autolayout之后获取uiview的frame
这个只要一行代码就搞定了.详细请看: In order to get the right frame/bounds of your UIImageView after resizing, you ne ...
- PAT甲 1007. Maximum Subsequence Sum (25) 2016-09-09 22:56 41人阅读 评论(0) 收藏
1007. Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...
- hdu 1014
我:题都看不懂 路人甲:这是随机数分配题目 路人乙:这是求生成元,求mod N的生成元,即生成元与N互质 路人丙:这是根据给出的递推公式算一下 0~ mod-1之间的数是否都有出现过,如果都出现了,那 ...
- centos7 源码安装python3
1.非常重要!必须得先安装py3所依赖的软件包,否则可能会出现py3安装成功,却缺少相应的pip yum groupinstall "Development tools" yum ...
- java递归和反向递归
1. 递归查询树tree结构有两种做法: 第一种,递归查询数据库结构, 第二种,一次性将数据库表中的所有数据查出来,然后再递归查出来的list集合, 第一种做法适合数据量较少的tree结构,因为要一直 ...
- 发个招聘贴,魔都求手游C++后端,UNITY前端,开发实习生
上海游旺网络科技有限公司成立于2015年5月,是一家极具潜力的新创移动游戏公司.公司初创团队均来自腾讯,盛大,畅游,墨麟,蜗牛等知名互联网公司,公司创始人团队参与制作过<鬼吹灯><Q ...