魔板

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

 #include <iostream>
#include <string>
#include <algorithm>
#include <queue>
#include<stdio.h>
using namespace std ;
const int MAXN = ; //由于此题数字1~8,康托展开的所有情况为8!,共40320种
const int fac[] = {,,,,,,,}; //康托展开中用到的0~7的阶乘
string ans[MAXN]; //存储各状态的变化步骤,预处理完成
struct node {
int a[];
int n;
} u,v;
void A(node &t) //A操作 {
std::reverse (t.a , t.a + ) ; }
void B(node &t) //B操作 {
std::rotate (t.a , t.a + , t.a + ) ;
std::rotate (t.a + , t.a + , t.a + ) ;
}
void C(node &t) //C操作 {
std::swap(t.a[],t.a[]);
std::swap(t.a[],t.a[]);
std::swap(t.a[],t.a[]); }
int contor(node &t) //康托展开 {
int tmp, num = ;
for(int i=; i<; i++)
{
tmp = ;
for(int j=i+; j<; j++)
{
if(t.a[j] < t.a[i])
{
tmp++; } }
num += tmp*fac[-i]; }
return num; }
void Init(void) {
void (*ptr[])(node&); //定义函数指针
ptr[] = A;
ptr[] = B;
ptr[] = C; //指向对应函数方便处理 int mark[MAXN] = {}; //设置标记
mark[] = ; for(int i=; i<; i++) //由初始状态12345678开始
{
u.a[i] = i+; }
u.n = contor(u); queue<node>que;
que.push(u);
while(!que.empty())
{
u = que.front();
que.pop();
for(int i=; i<; i++) //三种变换
{
v = u;
(*ptr[i])(v);
v.n = contor(v); //对副本执行操作并康托展开
if(mark[v.n] == ) //重复
{
char ch = 'A' + i;
ans[v.n] = ans[u.n] + ch; //记录步骤 mark[v.n] = ; //标记
que.push(v); } } } }
int main() {
//freopen ("a.txt" , "r" , stdin ) ;
Init();
char a[] = {},b[] = {};
while(~ scanf ("%s" , a))
{
scanf ("%s" , b) ;
int n[];
for(int i=; i<; i++) //把初态置换成12345678
{
n[a[i] - ''] = i+;
} for(int i=; i<; i++) //把目标状态相对于初态置换
{
u.a[i] = n[b[i] - '']; } cout<<ans[contor(u)]<<endl; //输出由12345678到目标态的步骤 }
return ;
}

hdu.1430.魔板(bfs + 康托展开)的更多相关文章

  1. HDU 1430 魔板(康托展开+BFS+预处理)

    魔板 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  2. hdu1430魔板(BFS+康托展开)

    做这题先看:http://blog.csdn.net/u010372095/article/details/9904497 Problem Description 在魔方风靡全球之后不久,Rubik先 ...

  3. HDU - 1430 魔板 (bfs预处理 + 康托)

    对于该题可以直接预处理初始状态[0, 1, 2, 3, 4, 5, 6, 7]所有可以到达的状态,保存到达的路径,直接打印答案即可. 关于此处的状态转换:假设有初始状态为2,3,4,5,0,6,7,1 ...

  4. hdu 1430 魔板 (BFS+预处理)

    Problem - 1430 跟八数码相似的一题搜索题.做法可以是双向BFS或者预处理从"12345678"开始可以到达的所有状态,然后等价转换过去直接回溯路径即可. 代码如下: ...

  5. HDU - 1430 魔板 【BFS + 康托展开 + 哈希】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1430 思路 我刚开始 想到的 就是 康托展开 但是这个题目是 多组输入 即使用 康托展开 也是会T的 ...

  6. HDU_1430——魔板,预处理,康托展开,置换,string类的+操作

    Problem Description 在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板.魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示.任一时刻魔板的状态可 ...

  7. [HDU 1430] 魔板

    魔板 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  8. hdu 1430 魔板 康托展开 + 很好的映射

    http://acm.hdu.edu.cn/showproblem.php?pid=1430 如果从start ---> end,每一次都bfs进行,那么就肯定会超时. 考虑到先把start映射 ...

  9. HDU_1043 Eight 【逆向BFS + 康托展开 】【A* + 康托展开 】

    一.题目 http://acm.hdu.edu.cn/showproblem.php?pid=1043 二.两种方法 该题很明显,是一个八数码的问题,就是9宫格,里面有一个空格,外加1~8的数字,任意 ...

随机推荐

  1. maven仓库没有的包依赖

    如果有个jar包是我们自己打的,怎么放到maven中呢? 首先在项目里面新建一个lib目录,如果有lib目录则不需要新建,然后放自己的jar包进去,maven的pom.xml配置是: <depe ...

  2. 企业应用系统设计分享PPT

    因今天上午需要为团队做一个分享,所以昨晚连夜写了一个<企业应用系统设计>的PPT,因为时间比较短,写的比较急.现在把PPT贴出来,做一个记录.同时也希望对大家有用. 文件我上传到了百度网盘 ...

  3. 三角形问题的解决复杂度O(n^3)和O(nlogn)的比较

    问题描述: n条棍子组成一个三角形,使得三角形周少最大. 方法一: 暴力解则算法复杂度为O(n^3) #include<stdio.h> const int MAX_N=105 int m ...

  4. LAMP-五分钟搭建个人论坛

    LAMP-五分钟搭建个人论坛 系统版本:CentOS7 1.##安装lamp及依赖软件wget http://repo.mysql.com/mysql-community-release-el7-5. ...

  5. iOS - 类簇

    类簇是在Objective-C中Foundation Framework中广泛使用的一种设计模式 1.发现类簇(Class Cluster)的踪迹 //*> 执行下面代码 id obj1 = [ ...

  6. JS-window对象集合

    知识点表格截图:

  7. java编程思想-java集合总结-基本概念

    1.java 容器类类库的用途是"保存对象",并将其划分为两个不同的概念: 1)Collection.一个独立元素的序列,这些元素都服从一条或多条规则.List 必须按照插入的顺序 ...

  8. 开发板ping不通主机和虚拟机的看过来(转载)!

    前几天在做uboot下用tftp下载文件到开发板的实验时,为了能解决开发板ping不通主机和虚拟机的问题,可谓绞尽脑汁,正所谓久病成医,虽然为了这一小问题废了我那么长时间,但我在解决问题的同时也学到了 ...

  9. 9.22 JS脚本语言DOM

    通用:onclick 鼠标单击ondblclick 鼠标双击onmouseover 鼠标放上onmouseout 鼠标离开onmousemove 鼠标移动 表单:onchang 表单的值改变onblu ...

  10. redis常用配置

    daemonize yes #是否以后台进程运行,默认为no pidfile /var/run/redis.pid #如以后台进程运行,则需指定一个pid,默认为/var/run/redis.pid ...