1054: [HAOI2008]移动玩具

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 2260  Solved: 1254
[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

比较麻烦的广搜,用二进制表示状态

例如状态:

0101

1111

0000

1111

先将其转化成一行:0101111100001111,接下来求出该二进制下的十进制数即可

很显然,最多不超过2^16-1(65535)个状态

#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
typedef struct
{int str[6][6];int step;
}State;
State temp, now;
queue<State> q;
int str[6][6], ed[6][6], flag[65536], dir[4][2] = {0,1,1,0,0,-1,-1,0};
int main(void)
{int i, j, k, sum, b, c, dx, dy;while(scanf("%1d", &c)!=EOF){memset(str, -1, sizeof(str));memset(ed, -1, sizeof(ed));memset(flag, 0, sizeof(flag));dx = dy = 0;for(i=1;i<=4;i++){for(j=1;j<=4;j++){if(i==1 && j==1)str[i][j] = c;elsescanf("%1d", &str[i][j]);dx += str[i][j];}}for(i=1;i<=4;i++){for(j=1;j<=4;j++)scanf("%1d", &ed[i][j]), dy += ed[i][j];}if(dx!=dy){printf("-1\n");continue;}sum = 0;for(i=1;i<=4;i++){for(j=1;j<=4;j++)sum *= 2, sum += ed[i][j];}flag[sum] = 7;sum = 0;for(i=1;i<=4;i++){for(j=1;j<=4;j++)sum *= 2, sum += str[i][j];}if(flag[sum]==7){printf("0\n");continue;}flag[sum] = 1;memcpy(now.str, str, sizeof(str));now.step = 0;q.push(now);while(q.empty()==0){now = q.front();q.pop();temp.step = now.step+1;for(i=1;i<=4;i++){for(j=1;j<=4;j++){if(now.str[i][j]==0){for(k=0;k<=3;k++){dx = i+dir[k][0];dy = j+dir[k][1];if(now.str[dx][dy]!=1)continue;memcpy(temp.str, now.str, sizeof(str));swap(temp.str[i][j], temp.str[dx][dy]);sum = 0;for(b=1;b<=4;b++){for(c=1;c<=4;c++)sum *= 2, sum += temp.str[b][c];}if(flag[sum]==0){flag[sum] = 1;q.push(temp);}else if(flag[sum]==7){while(q.empty()==0)q.pop();goto loop;}}}}}}loop:printf("%d\n", temp.step);}return 0;
}

bzoj 1054: [HAOI2008]移动玩具.cpp相关推荐

  1. BZOJ 1054: [HAOI2008]移动玩具(bfs)

    题面: https://www.lydsy.com/JudgeOnline/problem.php?id=1054 题解: 将每一种状态十六位压成二进制,然后bfs..不解释.. p.s.注意特判初始 ...

  2. BZOJ 1055 [HAOI2008]玩具取名

    1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1119  Solved: 653 [Submit][Sta ...

  3. bzoj 1055: [HAOI2008]玩具取名(区间DP)

    1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2010  Solved: 1177 [Submit][St ...

  4. [BZOJ]1055: [HAOI2008]玩具取名

    Time Limit: 10 Sec  Memory Limit: 162 MB Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字 ...

  5. bzoj 1056 [HAOI2008]排名系统(1862 [Zjoi2006]GameZ游戏排名系统)

    1056: [HAOI2008]排名系统 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1854  Solved: 502 [Submit][Sta ...

  6. [bzoj1054][HAOI2008]移动玩具

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

  7. BZOJ 1042 [HAOI2008]硬币购物

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1446  Solved: 845 [Submit][Sta ...

  8. BZOJ 1045 [HAOI2008]糖果传递 ★(环形等分:中位数)

    题意 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. 思路 假设平均数是x,且a1给an了k个(k<0说明是an给a1了-k个),那么总代价就 ...

  9. bzoj 1041: [HAOI2008]圆上的整点

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2838  Solved: 1238 [Submit][S ...

最新文章

  1. 第八届全国大学生智能汽车竞赛获奖名单
  2. Java_io体系之BufferedWriter、BufferedReader简介、走进源码及示例——16
  3. LPTSTR、LPCSTR、LPCTSTR、LPSTR的含义
  4. 安全测试中常见的术语
  5. oracle12c em 空白,Oracle12C 开启关闭em
  6. 业务规则的生命周期管理
  7. [转]Laravel与bootstrap-editable实现table的行内编辑
  8. 【系统知识点】linux入门基础命令
  9. golang学习之旅(2)- go的数据基本数据类型及变量定义方式
  10. centos7 修改默认yum源为国内的阿里云
  11. 处理sharepoint 列表中的 person or group类型字段
  12. 【Android】论ViewHolder存在的意义
  13. 雷军变身IPO收割机:坐拥4家上市公司,今年至少收获8个IPO!
  14. Access control allow origin 简单请求和复杂请求
  15. 泰坦尼克号数据集下载
  16. Codeforces 1153
  17. Html学习(二)font 加粗 斜体 下划线标签学习
  18. JavaSE学习总结第01天_Java概述
  19. vba工作表重命名_如何在Excel中重命名工作表选项卡
  20. tan0.75等于多少度用计算机怎么算,75度的正弦值是多少?怎么计算?

热门文章

  1. python3哪个版本稳定-不要再纠结Python哪个版本好,2020年用Python3就对了
  2. python直方图解释,请用Python详细解释二维直方图
  3. mysql signal函数_MySQL:简单记录信号处理
  4. JavaScript基础简单入门
  5. echarts环形图
  6. 【java笔记】File类(1)概述,静态成员,构造方法
  7. 字节序(Endian),大端(Big-Endian),小端(Little-Endian)
  8. 程序员怎样学习python_一个开发十年的程序员论:学习Python最正确的步骤(0基础必备)...
  9. 曙光天阔服务器文档,曙光天阔服务器远程控制手册(附件).doc
  10. java web mysql备份,Java Web 实现Mysql 数据库备份与还原