祝大家新年快乐,相信在新的一年里一定有我们自己的梦!

这是一个简化的魔板问题,只需输出步骤即可。

玩具(Toy)


描述

ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时的数字玩具。

该玩具酷似魔方,又不是魔方。具体来说,它不是一个3 * 3 * 3的结构,而是4 * 2的结构。

按照该玩具约定的玩法,我们可反复地以如下三种方式对其做变换:

A. 交换上下两行。比如,图(a)经此变换后结果如图(b)所示。

B. 循环右移(ZC神从小就懂得这是什么意思的)。比如,图(b)经此变换后结果如图(c)所示。

C. 中心顺时针旋转。比如,图(c)经此变换后结果如图(d)所示。

ZC神自小就是这方面的天才,他往往是一只手还没揩干鼻涕,另一只手已经迅速地将处于任意状态的玩具复原至如图(a)所示的初始状态。物质极其匮乏的当年,ZC神只有一个这样的玩具;物质极大丰富的今天,你已拥有多个处于不同状态的玩具。现在,就请将它们全部复原吧。

输入

第一行是一个正整数,即你拥有的魔方玩具总数N。

接下来共N行,每行8个正整数,表示该玩具的当前状态。

这里,魔方状态的表示规则为:前四个数自左向右给出魔方的第一行,后四个数自右向左给出第二行。比如,初始状态表示为“1 2 3 4 5 6 7 8”。

输出

共N行,各含一个整数,依次对应于复原各玩具所需执行变换的最少次数。

特别地,若某个玩具不可复原,则相应行输出-1。

输入样例

2
1 2 3 4 5 6 7 8
8 6 3 5 4 2 7 1

输出样例

0
2

限制

对于60%的数据,N = 1

对于100%的数据,1 <= N <= 1,000

时间:1 sec

空间:20MB

提示

状态转换图及其搜索


  解法可以参看我的另一篇文章:ACM/ICPC 之 BFS(离线)+康拓展开 (HDU1430-魔板)

  具体代码如下:

 //玩具(Toy),类似魔板问题,但只需输出步骤数即可
//Time:28Ms Memory:13376MB (No.10)
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define MAX 40321
int Map[MAX]; //状态图
int fac[] = { ,,,,,,,};
struct Board{
int fa; //记录上一状态
int val; //Hash值
char str[];
void Contor();
}m[*MAX],ts;
void Board::Contor()
{
int num = ;
for (int i = ; i < ; i++)
{
int tmp = ;
for (int j = i + ; j < ; j++)
{
if (this->str[j] < this->str[i]) tmp++;
}
num += tmp*fac[ - i];
}
this->val = num;
}
void Init(char s[])
{
int rear = ;
int tail = ;
strcpy(m[].str, s);
m[].Contor();
while (rear < tail) {
if (Map[m[rear].val])
{
rear++;
continue;
}
Map[m[rear].val] = Map[m[m[rear].fa].val] + ;
/*由于是反向搜索,因此将逆向操作即可*/
// 交换行
for (int i = ; i < ; i++)
m[tail].str[(i + ) % ] = m[rear].str[i];
m[tail].Contor();
if (!Map[m[tail].val]) {
m[tail].fa = rear;
tail++;
}
// 循环左移
for (int i = ; i < ; i++)
m[tail].str[(i + ) % ] = m[rear].str[i];
for (int i = ; i < ; i++)
m[tail].str[(i + ) % + ] = m[rear].str[i];
m[tail].Contor();
if (!Map[m[tail].val]) {
m[tail].fa = rear;
tail++;
}
// 中心逆旋转
strcpy(m[tail].str, m[rear].str);
m[tail].str[] = m[rear].str[]; m[tail].str[] = m[rear].str[];
m[tail].str[] = m[rear].str[]; m[tail].str[] = m[rear].str[];
m[tail].Contor();
if (!Map[m[tail].val]) {
m[tail].fa = rear;
tail++;
}
rear++;
}
}
int main()
{
/*预处理*/
Init("");
int T;
scanf("%d", &T);
while (T--)
{
int tmp;
for (int i = ; i < ; i++)
{
scanf("%d", &tmp);
ts.str[i] = tmp + '';
}
for (int i = ; i < ; i++)
{
scanf("%d", &tmp);
ts.str[( - i) + ] = tmp + '';
}
ts.Contor();
printf("%d\n", Map[ts.val] - );
}
return ;
}

ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))的更多相关文章

  1. ACM/ICPC 之 BFS(离线)+康拓展开 (HDU1430-魔板)

    魔板问题,一道经典的康拓展开+BFS问题,为了实现方便,我用string类来表示字符串,此前很少用string类(因为不够高效,而且相对来说我对char数组的相关函数比较熟),所以在这里也发现了很多容 ...

  2. 【HDOJ3567】【预处理bfs+映射+康拓展开hash】

    http://acm.hdu.edu.cn/showproblem.php?pid=3567 Eight II Time Limit: 4000/2000 MS (Java/Others)    Me ...

  3. ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))

    求一条蛇到(1,1)的最短路长,题目不简单,状态较多,需要考虑状态压缩,ZOJ的数据似乎比POj弱一些 POJ1324(ZOJ1361)-Holedox Moving 题意:一条已知初始状态的蛇,求其 ...

  4. ACM/ICPC 之 BFS范例(ZOJ2913-ZOJ1136(POJ1465))

    通过几道经典BFS例题阐述BFS思路 ZOJ2913-Bus Pass 题意:找一个center区域,使得center到所有公交线路最短,有等距的center则输出id最小的. 题解:经典的BFS,由 ...

  5. POJ-1077 HDU 1043 HDU 3567 Eight (BFS预处理+康拓展开)

    思路: 这三个题是一个比一个令人纠结呀. POJ-1077 爆搜可以过,94ms,注意不能用map就是了. #include<iostream> #include<stack> ...

  6. hdu 1043 pku poj 1077 Eight (BFS + 康拓展开)

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 http://poj.org/problem?id=1077 Eight Time Limit: 1000 ...

  7. 【HDOJ1043】【康拓展开+BFS】

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 Eight Time Limit: 10000/5000 MS (Java/Others)    Memo ...

  8. hdoj1043 Eight(逆向BFS+打表+康拓展开)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 思路: 由于自己对康拓展开用的太少,看到这个题没想到康拓展开,最开始打算直接转换为数字,但太占内 ...

  9. HDU 4531 bfs/康拓展开

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4531 吉哥系列故事——乾坤大挪移 Time Limit: 2000/1000 MS (Java/Othe ...

随机推荐

  1. java 的 AccessController.doPrivileged使用

    AccessController.doPrivileged意思是这个是特别的,不用做权限检查. 在什么地方会用到呢:加入1.jar中有类可以读取一个文件,现在我们要使用1.jar去做这个事情.但是我们 ...

  2. Java中的char到底是多少个字节?

    貌似一个简单的问题(也许还真是简单的)但是却把曾经自认为弄清楚的我弄得莫名其妙 char在Java中应该是16个字节byte在Java中应该是8个字节char x = '编'; //这样是合法的,输出 ...

  3. javascript自定义滚动条插件,几行代码的事儿

    在实际项目中,经常由于浏览器自带的滚动条样式太戳,而且在各个浏览器中显示不一样,所以我们不得不去实现自定义的滚动条,今天我就用最少的代码实现了一个自定义滚动条,代码量区区只有几十行,使用起来也非常方便 ...

  4. [译]简单得不得了的教程-一步一步用 NODE.JS, EXPRESS, JADE, MONGODB 搭建一个网站

    原文: http://cwbuecheler.com/web/tutorials/2013/node-express-mongo/ 原文的源代码在此 太多的教程教你些一个Hello, World!了, ...

  5. [译]Mongoose指南 - Population

    MongoDB没有join, 但是有的时候我们需要引用其它collection的documents, 这个时候就需要populate了. 我们可以populate单个document, 多个docum ...

  6. solrcloud

    @Test public void querySolrCloud(){ String zkHost = "127.0.0.1:2181"; String defaultCollec ...

  7. 【C语言入门教程】3.3 条件控制语句

    在程序的 3 种基本结构中,第二种是选择结构,选择结构是根据程序运行时获得的条件,决定程序执行情况.条件控制语句可用来实现这种结构,C 语言提供了 if 语句和 switch 语句两种条件控制语句,i ...

  8. mysql数据库性能调优总结积累

    mysql数据库的调优大概可以分为四大块 0 架构调优 ---根据业务 读写分库分表   ---主从 读写分离 1 配置的调优 ---开启缓存查询  设置缓存大小 ---最大连接数设置 ---数据库引 ...

  9. MVC后台传dt数据

    //MVC后台传dt数据 public JsonResult TeacherVoteInfo([FromBody]Teacher_VoteModel model) { string tname = m ...

  10. Redis 读后小感

    经过一个多月的业余时间,终于把 Redis 完整的撸了一遍,感谢峰哥推荐的书<Redis 设计与实现>,也谢谢作者把 Redis 解析的这么通俗易懂. 去年 10 月末入职的某厂是 Red ...