请注意$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的更多相关文章

  1. 胜利大逃亡(续)(状态压缩bfs)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  2. hdu 1254 推箱子(双重bfs)

    题目链接 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能 ...

  3. HDU_1254——推箱子,两次BFS

    这题做的一把鼻涕一把泪,果断考虑不周555 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱 ...

  4. hdu 3681 Prison Break(状态压缩+bfs)

    Problem Description Rompire . Now it’s time to escape, but Micheal# needs an optimal plan and he con ...

  5. 【HDU - 1429】胜利大逃亡(续) (高级搜索)【状态压缩+BFS】

    Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开 ...

  6. 推箱子 (hdu1254)(bfs双重广搜)

    推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission ...

  7. 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 ...

  8. 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 ...

  9. POJ - 1324 Holedox Moving (状态压缩+BFS/A*)

    题目链接 有一个n*m(1<=n,m<=20)的网格图,图中有k堵墙和有一条长度为L(L<=8)的蛇,蛇在移动的过程中不能碰到自己的身体.求蛇移动到点(1,1)所需的最小步数. 显然 ...

随机推荐

  1. FTP中各文件目录的说明

    DirectAdmin:FTP中各文件目录的说明     当您使用FTP连上空间后,FTP列表会出现以下文件和目录: domains目录:网站文件存放目录:public_html目录:快捷目录,可以快 ...

  2. 2018.09.25 bzoj3572: [Hnoi2014]世界树(虚树+树形dp)

    传送门 虚树入门题? 好难啊. 在学习别人的写法之后终于过了. 这道题dp方程很好想. 主要是不好写. 简要说说思路吧. 显然最优值只能够从子树和父亲转移过来. 于是我们先dfs一遍用儿子更新父亲,然 ...

  3. 2018.07.06 POJ2536 Gopher II(二分图匹配)

    Gopher II Time Limit: 2000MS Memory Limit: 65536K Description The gopher family, having averted the ...

  4. Ubuntu 16.04安装MySQL及遇到的问题解决方案

    使用以下命令即可进行MySQL安装: sudo apt-get install mysql-server 上述命令会安装以下包: apparmor mysql-client-5.7 mysql-com ...

  5. Airplace平台

    Demo: 左上角:(0, 0)开始导航,手机终端上实时在地图上当前所在显示,当前点以绿色点显示,轨迹点以红色显示. 系统架构:基于移动手机的以网络为辅助的架构.特点:低头顶交流,用户隐私和安全 &g ...

  6. 深浅 buffer

    var str = "深入浅出"; var buf = new Buffer(str, 'utf-8'); console.log(buf); 这种情况下是数字 var str = ...

  7. javascript 问题

    两个数组比较:a.sort().toString() == b.sort().toString() for循环内有异步方法时,需要闭包 JSON.parse(data)出错时(提示.[nodejs中] ...

  8. 转:ObjectInputStream类和ObjectInputStream类的使用

    ObjectInputStream和ObjectInputStream类创建的对象被称为对象输入流和对象输出流. 创建文件输出流代码: FileOutputStream file_out = new ...

  9. Python2.7升级至Python3.6

    Python2.7升级至Python3.6 今天在CentOS7.2上将python2.7升级至python3.6时遇到了诸多问题,下面将升级步骤以及解决方法一一列举. 1.安装Python3.6 安 ...

  10. Nodejs-- web服务器

    第一篇关于nodejs的东西,代码在此作为备份. 该代码目前未完成,是一个阻塞式的代码. 1.index.js ar server=require('./server'); var route=req ...