ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))

2023-10-24 20:30

本文主要是介绍ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy)),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

 

玩具(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-魔板)

 

  具体代码如下:

 1 //玩具(Toy),类似魔板问题,但只需输出步骤数即可
 2 //Time:28Ms  Memory:13376MB (No.10)
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 using namespace std;
 7 #define MAX 40321
 8 int Map[MAX];    //状态图
 9 int fac[8] = { 1,1,2,6,24,120,720,5040};
10 struct Board{
11     int fa;        //记录上一状态
12     int val;    //Hash值
13     char str[9];
14     void Contor();
15 }m[2*MAX],ts;
16 void Board::Contor()
17 {
18     int num = 0;
19     for (int i = 0; i < 8; i++)
20     {
21         int tmp = 0;
22         for (int j = i + 1; j < 8; j++)
23         {
24             if (this->str[j] < this->str[i]) tmp++;
25         }
26         num += tmp*fac[7 - i];
27     }
28     this->val = num;
29 }
30 void Init(char s[9])
31 {
32     int rear = 0;
33     int tail = 1;
34     strcpy(m[0].str, s);
35     m[0].Contor();
36     while (rear < tail) {
37         if (Map[m[rear].val])
38         {
39             rear++;
40             continue;
41         }
42         Map[m[rear].val] = Map[m[m[rear].fa].val] + 1;
43         /*由于是反向搜索,因此将逆向操作即可*/
44         // 交换行
45         for (int i = 0; i < 8; i++)
46             m[tail].str[(i + 4) % 8] = m[rear].str[i];
47         m[tail].Contor();
48         if (!Map[m[tail].val]) {
49             m[tail].fa = rear;
50             tail++;
51         }
52         // 循环左移
53         for (int i = 0; i < 4; i++)
54             m[tail].str[(i + 3) % 4] = m[rear].str[i];
55         for (int i = 4; i < 8; i++)
56             m[tail].str[(i + 3) % 4 + 4] = m[rear].str[i];
57         m[tail].Contor();
58         if (!Map[m[tail].val]) {
59             m[tail].fa = rear;
60             tail++;
61         }
62         // 中心逆旋转
63         strcpy(m[tail].str, m[rear].str);
64         m[tail].str[5] = m[rear].str[1]; m[tail].str[1] = m[rear].str[2];
65         m[tail].str[2] = m[rear].str[6]; m[tail].str[6] = m[rear].str[5];
66         m[tail].Contor();
67         if (!Map[m[tail].val]) {
68             m[tail].fa = rear;
69             tail++;
70         }
71         rear++;
72     }
73 }
74 int main()
75 {
76     /*预处理*/
77     Init("12348765");
78     int T;
79     scanf("%d", &T);
80     while (T--)
81     {
82         int tmp;
83         for (int i = 0; i < 4; i++)
84         {
85             scanf("%d", &tmp);
86             ts.str[i] = tmp + '0';
87         }
88         for (int i = 4; i < 8; i++)
89         {
90             scanf("%d", &tmp);
91             ts.str[(8 - i) + 3] = tmp + '0';
92         }
93         ts.Contor();
94         printf("%d\n", Map[ts.val] - 1);
95     }
96     return 0;
97 }

 

转载于:https://www.cnblogs.com/Inkblots/p/5093255.html

这篇关于ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/277600

相关文章

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为

POJ 3057 最大二分匹配+bfs + 二分

SampleInput35 5XXDXXX...XD...XX...DXXXXX5 12XXXXXXXXXXXXX..........DX.XXXXXXXXXXX..........XXXXXXXXXXXXX5 5XDXXXX.X.DXX.XXD.X.XXXXDXSampleOutput321impossible

深度优先(DFS)和广度优先(BFS)——算法

深度优先 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支,当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访

安卓玩机工具------小米工具箱扩展工具 小米机型功能拓展

小米工具箱扩展版                     小米工具箱扩展版 iO_Box_Mi_Ext是由@晨钟酱开发的一款适用于小米(MIUI)、多亲(2、2Pro)、多看(多看电纸书)的多功能工具箱。该工具所有功能均可以免root实现,使用前,请打开开发者选项中的“USB调试”  功能特点 【小米工具箱】 1:冻结MIUI全家桶,隐藏状态栏图标,修改下拉通知栏图块数量;冻结

全英文地图/天地图和谷歌瓦片地图杂交/设备分布和轨迹回放/无需翻墙离线使用

一、前言说明 随着风云局势的剧烈变化,对我们搞软件开发的人员来说,影响也是越发明显,比如之前对美对欧的软件居多,现在慢慢的变成了对大鹅和中东以及非洲的居多,这两年明显问有没有俄语或者阿拉伯语的输入法的增多,这要是放在2019年以前,一年也遇不到一个人问这种需求场景的。 地图应用这块也是,之前的应用主要在国内,现在慢慢的多了一些外国的应用场景,这就遇到一个大问题,我们平时主要开发用的都是国内的地

OpenStack离线Train版安装系列—3控制节点-Keystone认证服务组件

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

OpenStack离线Train版安装系列—2计算节点-环境准备

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版