1054: [HAOI2008]移动玩具

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 2741  Solved: 1537
[Submit][Status][Discuss]

Description

  在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动
时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移
动到某人心中的目标状态。

Input

  前4行表示玩具的初始状态,每行4个数字1或0,1表示方格中放置了玩具,0表示没有放置玩具。接着是一个空
行。接下来4行表示玩具的目标状态,每行4个数字1或0,意义同上。

Output

  一个整数,所需要的最少移动次数。

Sample Input

1111
0000
1110
0010

1010
0101
1010
0101

Sample Output

4

HINT

Source


提交地址BZOJ1054


题解 :

调了很久, 我还是太菜了;

就是广搜,没什么难度;

一个数组写错了调了半天QAQ;


Code:

 #include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std; int dx[]={, , , -, }, dy[]={, , , , -};
bool a[][], b[][]; inline int Hash(bool t[][])
{
int k = , s = ;
for (register int i = ; i <= ; i ++)
{
for (register int j = ; j <= ;j ++)
{
s += k * t[i][j];k <<= ;
}
}
return s;
} bool vis[]; struct date
{
bool o[][];
int stp;
}q[]; int main()
{
for (register int i = ; i <= ; i ++)
for (register int j = ; j <= ; j ++)
scanf("%1d", &a[i][j]), q[].o[i][j] = a[i][j];
for (register int i = ; i <= ; i ++)
for (register int j = ; j <= ; j ++)
scanf("%1d", &b[i][j]); int beg = Hash(a), end = Hash(b);
if (beg == end) {puts("");return ;}
vis[beg] = ;
int l = , r = ;
while (l < r)
{
for (register int i = ; i <= ; i ++)
{
for (register int j = ; j <= ; j ++)
{
if (!q[l].o[i][j]) continue;
for (register int k = ; k <= ; k ++)
{
int x = i + dx[k], y = j + dy[k];
if (q[l].o[x][y]) continue;
if (x <= or y <= or x > or y > ) continue;
swap(q[l].o[i][j], q[l].o[x][y]);
int H = Hash(q[l].o);
if (!vis[H])
{
if (H == end) {printf("%d\n", q[l].stp +);return ;}
vis[H] = ;
memcpy(q[r].o, q[l].o, sizeof q[r].o);
q[r].stp = q[l].stp + ;
r++;
}
swap(q[l].o[i][j], q[l].o[x][y]);
}
}
}
l++;
}
return ;
}

最新文章

  1. dubbo升级spring4与cxf
  2. 软件工程(FZU2015)学生博客列表(最终版)
  3. 重签名问题:does not have a signature matching
  4. MongoDB入门三:MongoDB shell
  5. Power-BI 报表常用功能自适应设置
  6. php连接MongoDB
  7. WCF入门教程二[WCF应用的通信过程]
  8. [leetcode]_Count and Say
  9. flex 4 写皮肤
  10. IOS触摸事件和手势识别
  11. Docker系列(八)Kubernetes介绍
  12. java.lang.StringBuilder源码分析
  13. Android Studio中JNI -- 2 -- 编写c文件
  14. js中callee与caller的区别
  15. Dominating Patterns
  16. Verilog 任意(奇数/偶数)分频器
  17. 如何在win10查看wifi密码
  18. Java 8 Stream介绍及使用2
  19. vue中展示数据
  20. LeetCode 122 Best Time to Buy and Sell Stock II 解题报告

热门文章

  1. JAVA特性:原子性、可见性、有序性
  2. Day 2 Bash shell 认识
  3. App引流增长技术:Deeplink(深度链接)技术
  4. unity - TileMap的注意事项
  5. Flask关于request一些方法和属性的整理(持续更新)
  6. js之捕捉冒泡和事件委托
  7. JVM 调优 - JPS
  8. Spring 梳理-profile与条件化定义bean
  9. Git项目分支分配
  10. Java Map知识点