【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)所需的最小步数. 显然 ...
随机推荐
- win7 一切软件都安装不上 解决 把他卸掉
KB2962872 控制面板,添加删除程序,查看已更新
- 2018.10.16 NOIP模拟 膜法(组合数学)
传送门 原题,原题,全TM原题. 不得不说天天考原题. 其实这题我上个月做过类似的啊,加上dzyodzyodzyo之前有讲过考试直接切了. 要求的其实就是∑i=lr(ii−l+k)\sum _{i=l ...
- 43 We were Born to Nap 我们天生需要午睡
We were Born to Nap 我们天生需要午睡 ①American society is not nap-friendly.In fact, says David Dinged, a sle ...
- C++之new/delete/malloc/free详解
主要内容: 1. C语言中的函数malloc和free 2. C++中的运算符new和delete 3. new/delete与malloc/free之间的联系和区别 4. C/C++程序的内 ...
- C#和MatLab的混合编程(充分利用二者的优势)
C#和MatLab的混合编程,充分利用了winform的直观显示和matlab的强大计算能力.在此以一个小例子的形式给大家讲述一下二者混合编程的实现. 一.软件的配置说明 C#版本:VS2010:Ma ...
- swagger core 和 swagger ui 如何关联【窥探】
几个片段: package io.swagger.jaxrs.listing; import io.swagger.annotations.ApiOperation; import org.apach ...
- IOS11下fixed中input光标错位问题
项目遇到了这个问题,故作了个临时解决方案,暂时没有想到更好的方法,查阅了网上的方案,也没有找到完美的解决方案. 方案思路: ①弹窗打开时,阻止 body 滚动,禁用 touchmove ,同时记录当前 ...
- [Delphi]带进度条的ListView
带进度条的ListView unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, C ...
- VS2012 中不能安装ARCGIS 10.0 SDK的解决方法
问题描述 在ARCGIS 安装SDK时 就会出错 原因是ARCGIS SDK 10.0只能在VS2010中安装,因为我本机是安的VS2012所以安装不成功. 解决方法 一,在注册表中HKE ...
- AgentJob--无法重启Job--22022错误
错误描述: 发现有个Job计划为长期重复运行,但从某个时间点后未运行,无任何错误信息. 手动启动该Job后爆以下错误 运行环境: Window Server 2008 R2 Enterprise Mi ...