hdu.1430.魔板(bfs + 康托展开)

魔板

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2170    Accepted Submission(s): 455

Problem Description
在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板。魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示。任一时刻魔板的状态可用方块的颜色序列表示:从魔板的左上角开始,按顺时针方向依次写下各方块的颜色代号,所得到的数字序列即可表示此时魔板的状态。例如,序列(1,2,3,4,5,6,7,8)表示魔板状态为:
1 2 3 4 8 7 6 5
对于魔板,可施加三种不同的操作,具体操作方法如下:
A: 上下两行互换,如上图可变换为状态87654321 B: 每行同时循环右移一格,如上图可变换为41236785 C: 中间4个方块顺时针旋转一格,如上图可变换为17245368
给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。

 

Input
每组测试数据包括两行,分别代表魔板的初态与目态。

 

Output
对每组测试数据输出满足题意的变换步骤。

 

Sample Input
12345678 17245368 12345678 82754631

 

Sample Output
C AC
  1 #include <iostream>
  2 #include <string>
  3 #include <algorithm>
  4 #include <queue>
  5 #include<stdio.h>
  6 using namespace std ;
  7 const int MAXN = 40321; //由于此题数字1~8,康托展开的所有情况为8!,共40320种
  8 const int fac[8] = {1,1,2,6,24,120,720,5040}; //康托展开中用到的0~7的阶乘
  9 string ans[MAXN]; //存储各状态的变化步骤,预处理完成
 10 struct node
 11 
 12 {
 13     int a[8];
 14     int n;
 15 } u,v;
 16 void A(node &t) //A操作
 17 
 18 {
 19     std::reverse (t.a , t.a + 8) ;
 20 
 21 }
 22 void B(node &t) //B操作
 23 
 24 {
 25      std::rotate (t.a , t.a + 3, t.a + 4 ) ;
 26      std::rotate (t.a + 4 , t.a + 5 , t.a + 8 ) ;
 27 }
 28 void C(node &t) //C操作
 29 
 30 {
 31     std::swap(t.a[1],t.a[6]);
 32     std::swap(t.a[6],t.a[5]);
 33     std::swap(t.a[5],t.a[2]);
 34 
 35 }
 36 int contor(node &t) //康托展开
 37 
 38 {
 39     int tmp, num = 0;
 40     for(int i=0; i<8; i++)
 41     {
 42         tmp = 0;
 43         for(int j=i+1; j<8; j++)
 44         {
 45             if(t.a[j] < t.a[i])
 46             {
 47                 tmp++;
 48 
 49             }
 50 
 51         }
 52         num += tmp*fac[7-i];
 53 
 54     }
 55     return num;
 56 
 57 }
 58 void Init(void)
 59 
 60 {
 61     void (*ptr[3])(node&); //定义函数指针
 62     ptr[0] = A;
 63     ptr[1] = B;
 64     ptr[2] = C; //指向对应函数方便处理
 65 
 66     int mark[MAXN] = {0}; //设置标记
 67     mark[0] = 1;
 68 
 69     for(int i=0; i<8; i++) //由初始状态12345678开始
 70     {
 71         u.a[i] = i+1;
 72 
 73     }
 74     u.n = contor(u);
 75 
 76     queue<node>que;
 77     que.push(u);
 78     while(!que.empty())
 79     {
 80         u = que.front();
 81         que.pop();
 82         for(int i=0; i<3; i++) //三种变换
 83         {
 84             v = u;
 85             (*ptr[i])(v);
 86             v.n = contor(v); //对副本执行操作并康托展开
 87             if(mark[v.n] == 0) //重复
 88             {
 89                 char ch = 'A' + i;
 90                 ans[v.n] = ans[u.n] + ch; //记录步骤
 91 
 92                 mark[v.n] = 1; //标记
 93                 que.push(v);
 94 
 95             }
 96 
 97         }
 98 
 99     }
100 
101 }
102 int main()
103 
104 {
105     //freopen ("a.txt" , "r" , stdin ) ;
106     Init();
107     char a[10] = {0},b[10] = {0};
108     while(~ scanf ("%s" , a))
109     {
110         scanf ("%s" , b) ;
111         int n[10];
112         for(int i=0; i<8; i++) //把初态置换成12345678
113         {
114             n[a[i] - '0'] = i+1;
115         }
116 
117         for(int i=0; i<8; i++) //把目标状态相对于初态置换
118         {
119             u.a[i] = n[b[i] - '0'];
120 
121         }
122 
123         cout<<ans[contor(u)]<<endl; //输出由12345678到目标态的步骤
124 
125     }
126     return 0;
127 }
View Code

 

转载于:https://www.cnblogs.com/get-an-AC-everyday/p/4503162.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql006添加外键约束

-- 添加外键 -- 建立主表&#xff0c;班级表 CREATE TABLE class( cno int PRIMARY key auto_increment, cname VARCHAR(55) ) SELECT * FROM class; -- 建立从表&#xff0c;学生表 CREATE table stu( sno int PRIMARY KEY auto_increment, sname VARCHAR(55), sex ch…

Circle-Progress-View

https://github.com/jakob-grabner/Circle-Progress-View 转载于:https://www.cnblogs.com/eustoma/p/4507476.html

elasticsearch 删除满足条件的语句_ELK从入门到还未精通(二)——ElasticSearch上篇

大家好&#xff0c;我是泥腿子安尼特&#xff0c;5个月没在李佬都公众号更新文章了。上一篇&#xff0c;大致介绍了作为工具人的我是如何基本使用这一套ELK 系统的。今天就讲讲这个最重要的E——基于Lucene的搜索引擎ElasticSearch(后面简称ES)。最近刚搬家&#xff0c;没想到隔…

mysql004操作表.增删改

-- 查询表中数据 DQL 注意在mydb数据库下面 SELECT * FROM stdent; -- 新增数据 这种写法数据的循序和数据库的字段循序保持一致。 INSERT INTO stdent values (1,"张三","男",25,"2021.1.1","java","123qq.com"); --…

纸板怎么切割光滑_激光切割机大PK!光纤、CO2、YAG,你选谁?!

问&#xff1a;我也是钣金人&#xff0c;怎么加入组织&#xff1f;答&#xff1a;点标题下方蓝字“钣金家园光纤激光切割机之所以能在市场快速站稳脚跟并且逐步替代传统切割工艺&#xff0c;是由于其在各方面独具优势&#xff0c;那么他到底优秀在哪里呢&#xff1f;我们把CO2激…

mysql007.算数运算.别名.去重.排序

-- 创建DEPT表 CREATE TABLE DEPT( DEPTNO int(2) not null, DNAME VARCHAR(14), LOC VARCHAR(13) ); -- 查询DEPT表 SELECT * FROM DEPT; -- 修改表&#xff0c;添加主键 ALTER TABLE DEPT add CONSTRAINT PK_DEPT PRIMARY KEY(DEPTNO); -- 查询表结构。 desc DEPT; …

c# 蓝牙虚拟串口_蓝牙模块——基础知识介绍

1. 数据透传蓝牙模块可以通过串口(SPI、IIC)和MCU控制设备进行数据传输。蓝牙模块可以做为主机和从机。主机就是能够搜索别的蓝牙模块并主动建立连接&#xff0c;从机则不能主动建立连接&#xff0c;只能等别人连接自己。2. 低功耗低功耗蓝牙(Bluetooth Low Energy)&#xff0c…

Error: could not open `C:\Java\jre7\lib\i386\jvm.cfg

打开eclipse时出现Error: could not open C:\Program Files\Java\jre7\lib\i586\jvm.cfg’) 删除 c:\windows\system32\java&#xff0c; c:\windows\system32\javaw&#xff0c; c:\windows\system32\javaws, 如果是64位系统&#xff0c;还要删除 c:\windows\SysWOW64\java&am…

java项目001.双色球游戏

package Suangseq; //双色球游戏制作。 import java.awt.SystemColor; import java.util.Arrays; import java.util.Scanner; public class TextA { public static void main(String[] args) { boolean flagfalse;//定义一个布尔类型的变量。 int[] mynull;//定义一个变量 in…

华为手机30s桌面循环滑动_华为发飙了!麒麟820+双模5G,从2699元跌至2499元,超出消费者预期...

阅读本文前&#xff0c;请您先点击上面的“蓝色字体”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到文章了。每天都会有分享&#xff0c;都是免费订阅&#xff0c;请您放心关注。注图文来源网络&#xff0c;侵删 …

混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集...

其调用的方法是从sqlite数据库中获取原来已经使用过的数据库连接&#xff0c;当时也没注意&#xff0c;就是准备设断点然后单步调试&#xff0c;结果竟然是断点无法进入方法体内&#xff0c;后来仔细看了一下方法体的时候发现了一个问题&#xff0c;就是现有的System.Data.Sqli…

mysql008where.or.in查询

-- 创建EMP表 CREATE TABLE EMP ( EMPNO int(4) PRIMARY KEY, ENAME VARCHAR(10), JOB VARCHAR(9), MGR INT(4), HIREDATE DATE, SAL DOUBLE(7,2), COMM DOUBLE(7,2), DEPTNO INT(2) ); -- where查询 语句 SELECT * from emp; SELECT * FROM DEPT; SELECT * FROM…

微信接口请求次数_接口签名验证常用方案

前面的文章说了接口数据如何获取&#xff0c;今天就来聊聊接口数据的安全问题。说到接口加密验证&#xff0c;通常都称作“签名”&#xff0c;类似于名人的个性签名&#xff0c;让其它人无法模仿。比如说请求接口删除自己写的文章&#xff0c;又或者请求接口查询自己的帐单明细…

mysql009模糊查询like.是否为null

-- 创建EMP表 CREATE TABLE EMP ( EMPNO int(4) PRIMARY KEY, ENAME VARCHAR(10), JOB VARCHAR(9), MGR INT(4), HIREDATE DATE, SAL DOUBLE(7,2), COMM DOUBLE(7,2), DEPTNO INT(2) ); -- where查询 语句 SELECT * from emp; -- 模糊查询 -- 搜索emp表中还有A的…

28335接两个spi设备_SPI浅析

01 SPI简介SPI,全称为Serial Peripheral interface&#xff0c;即串行外围设备接口。由摩托罗拉率先在产品上使用。SPI是一种高速全双工&#xff0c;同步(full duplex synchronous)的通信总线协议&#xff0c;且占用硬件端口只有4个(SO,SI, SCLK 和CSN)&#xff0c;所以出于这…

java mongo 获取所有数据库_Spring Batch —从XML读取并写入Mongo

Java面试必备之JVMGC教程这几天闲着在优锐课的java学习必备中学习了&#xff0c;在本文中&#xff0c;了解如何使用Spring Batch通过StaxEventItemReader使用ItemReader读取XML文件并将其数据写入NoSQL。在本文中&#xff0c;我们将向展示如何使用Spring Batch使用StaxEventIte…

001多表查询.交叉链接cross JOIN.自然链接natural JOIN.using链接.on链接

-- 需求&#xff1a;查询每一个员工信息&#xff0c;并且显示每一个员工所在的部门名称 -- mysql中多表查询有四种&#xff0c;交叉链接cross JOIN&#xff0c;自然链接natural JOIN&#xff0c;using链接&#xff0c;on链接 -- 交叉链接cross JOIN SELECT * FROM emp; --6…

华菱重卡仪表指示说明_新一代创虎重卡登场!LNG车型将配玉柴燃气发动机

2020年10月23日&#xff0c;现代商用车新一代创虎重卡正式发布&#xff0c;此次新车不仅外观与韩国本土同步&#xff0c;更是首次搭载了国产玉柴动力&#xff0c;推出了LNG版车型。具体情况我们先抢先看看吧&#xff01;外观升级 与韩国本土同步我们可以看到&#xff0c;相比此…

mysql002多表查询.on链接分为三种情况,左链接,右链接,全链接

-- on链接&#xff08;最实用&#xff09;&#xff0c;分为三种情况&#xff0c;左链接&#xff0c;右链接&#xff0c;全链接 -- 左外链接&#xff0c;左表全部显示&#xff0c;如果匹配不到右表的内容使用null代替。 SELECT * FROM emp e LEFT JOIN dept d ON e.DEPTNOd.DE…

x轴z轴代表的方向图片_游戏中到底是Z轴朝上还是Y轴朝上?

本文转自我的公众号——游戏开发那些事在谈到游戏世界中的坐标轴时&#xff0c;我们经常会看到这样的争论。“游戏中Y轴是向上的好么&#xff1f;这你都不知道&#xff1f;”“不对&#xff0c;空间直角坐标系不就是Z轴向上的么&#xff1f;”“拜托&#xff0c;请搞清楚坐标系…