bzoj 1054: [HAOI2008]移动玩具.cpp
1054: [HAOI2008]移动玩具
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 2260 Solved: 1254
[Submit][Status][Discuss]
Description
Input
Output
一个整数,所需要的最少移动次数。
Sample Input
Sample Output
比较麻烦的广搜,用二进制表示状态
例如状态:
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相关推荐
- BZOJ 1054: [HAOI2008]移动玩具(bfs)
题面: https://www.lydsy.com/JudgeOnline/problem.php?id=1054 题解: 将每一种状态十六位压成二进制,然后bfs..不解释.. p.s.注意特判初始 ...
- BZOJ 1055 [HAOI2008]玩具取名
1055: [HAOI2008]玩具取名 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1119 Solved: 653 [Submit][Sta ...
- bzoj 1055: [HAOI2008]玩具取名(区间DP)
1055: [HAOI2008]玩具取名 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2010 Solved: 1177 [Submit][St ...
- [BZOJ]1055: [HAOI2008]玩具取名
Time Limit: 10 Sec Memory Limit: 162 MB Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字 ...
- bzoj 1056 [HAOI2008]排名系统(1862 [Zjoi2006]GameZ游戏排名系统)
1056: [HAOI2008]排名系统 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1854 Solved: 502 [Submit][Sta ...
- [bzoj1054][HAOI2008]移动玩具
题意:在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动 时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具 ...
- BZOJ 1042 [HAOI2008]硬币购物
1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1446 Solved: 845 [Submit][Sta ...
- BZOJ 1045 [HAOI2008]糖果传递 ★(环形等分:中位数)
题意 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. 思路 假设平均数是x,且a1给an了k个(k<0说明是an给a1了-k个),那么总代价就 ...
- bzoj 1041: [HAOI2008]圆上的整点
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2838 Solved: 1238 [Submit][S ...
最新文章
- 第八届全国大学生智能汽车竞赛获奖名单
- Java_io体系之BufferedWriter、BufferedReader简介、走进源码及示例——16
- LPTSTR、LPCSTR、LPCTSTR、LPSTR的含义
- 安全测试中常见的术语
- oracle12c em 空白,Oracle12C 开启关闭em
- 业务规则的生命周期管理
- [转]Laravel与bootstrap-editable实现table的行内编辑
- 【系统知识点】linux入门基础命令
- golang学习之旅(2)- go的数据基本数据类型及变量定义方式
- centos7 修改默认yum源为国内的阿里云
- 处理sharepoint 列表中的 person or group类型字段
- 【Android】论ViewHolder存在的意义
- 雷军变身IPO收割机:坐拥4家上市公司,今年至少收获8个IPO!
- Access control allow origin 简单请求和复杂请求
- 泰坦尼克号数据集下载
- Codeforces 1153
- Html学习(二)font 加粗 斜体 下划线标签学习
- JavaSE学习总结第01天_Java概述
- vba工作表重命名_如何在Excel中重命名工作表选项卡
- tan0.75等于多少度用计算机怎么算,75度的正弦值是多少?怎么计算?
热门文章
- python3哪个版本稳定-不要再纠结Python哪个版本好,2020年用Python3就对了
- python直方图解释,请用Python详细解释二维直方图
- mysql signal函数_MySQL:简单记录信号处理
- JavaScript基础简单入门
- echarts环形图
- 【java笔记】File类(1)概述,静态成员,构造方法
- 字节序(Endian),大端(Big-Endian),小端(Little-Endian)
- 程序员怎样学习python_一个开发十年的程序员论:学习Python最正确的步骤(0基础必备)...
- 曙光天阔服务器文档,曙光天阔服务器远程控制手册(附件).doc
- java web mysql备份,Java Web 实现Mysql 数据库备份与还原