【BZOJ 1054】 [HAOI2008]移动玩具
Description
在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移动到某人心中的目标状态。
Input
前4行表示玩具的初始状态,每行4个数字1或0,1表示方格中放置了玩具,0表示没有放置玩具。接着是一个空行。接下来4行表示玩具的目标状态,每行4个数字1或0,意义同上。
Output
一个整数,所需要的最少移动次数。
Sample Input
0000
1110
0010
1010
0101
1010
0101
Sample Output
#include<cstdio>
#include<cstring>
using namespace std;
int map[][],mb[][],b[][],bs[][],q[][],h[],t[],ans;
bool pd[][],flag;
int hash(int b[][]){
int mid=;
for (int i=;i<;i++)
for (int j=;j<;j++){
mid=mid<<;
mid=mid|b[i][j];
}
return mid;
} void make(int v,int b[][],int f){
int mid=hash(b);
if (!pd[v][mid]) {
pd[v][mid]++;
bs[v][mid]=f+;
q[v][++t[v]]=mid;
}
if(pd[v^][mid]) {
flag=;ans=bs[v][mid]+bs[v^][mid];//这个地方不需要-1
return;
}
} void bfs(int v){
memset(b,,sizeof(b));
int now=q[v][++h[v]],w=bs[v][now];
int x=,y=;
for (int i=;i<=;i++){
b[x][y]=now&;
now=now>>;
y--; if(y==-)y=,x--;
}
for (int i=;i<=;i++)
for (int j=;j<;j++){
if (i!=&&b[i-][j]!=b[i][j]) {
b[i][j]^=;b[i-][j]^=;
make(v,b,w);
if (flag) return;
b[i][j]^=;b[i-][j]^=;
}
if (i!=&&b[i+][j]!=b[i][j]){
b[i][j]^=;b[i+][j]^=;
make(v,b,w);
if (flag) return;
b[i][j]^=;b[i+][j]^=;
}
if (j!=&&b[i][j]!=b[i][j-]){
b[i][j]^=;b[i][j-]^=;
make(v,b,w);
if (flag) return;
b[i][j]^=;b[i][j-]^=;
}
if (j!=&&b[i][j]!=b[i][j+]){
b[i][j]^=;b[i][j+]^=;
make(v,b,w);
if (flag) return;
b[i][j]^=;b[i][j+]^=;
}
}
} int main(){
char s[];
for (int i=;i<;i++){
scanf("%s",s);
for (int j=;j<;j++)
map[i][j]=s[j]-'';
}
for (int i=;i<;i++){
scanf("%s",s);
for (int j=;j<;j++)
mb[i][j]=s[j]-'';
}
h[]=h[]=;
make(,map,-);make(,mb,-);
while(h[]<t[]||h[]<t[]){
if (h[]==t[]) bfs();
if (flag) break;
if (h[]==t[]) bfs();
if (flag) break;
if (t[]-h[]<t[]-h[]) bfs();else bfs();
if (flag) break;
}
printf("%d",ans);
}
【BZOJ 1054】 [HAOI2008]移动玩具的更多相关文章
- bzoj 1054: [HAOI2008]移动玩具 bfs
1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description 在 ...
- BZOJ 1054 [HAOI2008]移动玩具
1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1388 Solved: 764[Submit][Statu ...
- BZOJ 1054: [HAOI2008]移动玩具(bfs)
题面: https://www.lydsy.com/JudgeOnline/problem.php?id=1054 题解: 将每一种状态十六位压成二进制,然后bfs..不解释.. p.s.注意特判初始 ...
- 1054: [HAOI2008]移动玩具
1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1272 Solved: 690[Submit][Statu ...
- 【BZOJ】1054: [HAOI2008]移动玩具(bfs+hash)
http://www.lydsy.com/JudgeOnline/problem.php?id=1054 一开始我还以为要双向广搜....但是很水的数据,不需要了. 直接bfs+hash判重即可. # ...
- 1054: [HAOI2008]移动玩具 - BZOJ
Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动 ...
- 1054. [HAOI2008]移动玩具【BFS】
Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动 时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移 ...
- [HAOI 2005][BZOJ 1054] 移动玩具
先贴一波题面 1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2288 Solved: 1270 Descr ...
- BZOJ 1054 题解
1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1888 Solved: 1035[Submit][Stat ...
- BZOJ 1054 广搜
1054: [HAOI2008]移动玩具 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动 时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩 ...
随机推荐
- mysql输出的错误提示是法语
参考MySQL用户手册 http://dev.mysql.com/doc/refman/5.5/en/error-message-language.html mysql.ini 文件里头有一个参数叫做 ...
- C# 截图类
注意修改命名空间using System.Drawing; using System.Windows.Forms; namespace WindowsFormsApplication1 { ...
- ASP.NET二级域名站点共享Session状态
我的前面一篇文章提到了如何在使用了ASP.NET form authentication的二级站点之间共享登陆状态, http://www.cnblogs.com/jzywh/archive/2007 ...
- HDOJ2027统计元音
统计元音 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- python学习day1--python基础
Python的优缺点 先看优点 Python的定位是“优雅”.“明确”.“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂 ...
- win10下怎么在桌面创建IIS快捷方式
在电脑上打开C:\Windows\System32\inetsrv,在里面找到InetMgr.exe,如图 2 右击InetMgr.exe会发现没有发送到桌面的选项,所以我们选择创建快捷方式,如图 3 ...
- Android之图片窗口和大小调节
结构图: 基类: package ch.halcyon.squareprogressbar.example; import android.app.Activity; import android.a ...
- 省市数据递归加载到TreeView
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 【leetcode】363. Max Sum of Rectangle No Larger Than K
题目描述: Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the ma ...
- Windows下Android模拟环境的搭建