魔板

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

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
 
Author
LL
 
Source
 
 
题解:康托展开没什么玄乎的,就相当于HASH的功能,主要是映射很牛,解法,映射:
这里已经解释的很清楚了,我就直接引用了.

列如:位置:12345678                12345678

起初: 63728145       变      12345678

终点: 86372541       成       51234876

解释一下:初:6在第1个位,那么在终点中找6用1代替,3在第2个位,在终点中找3用2代替,依次类推。

一开始我们就先按 12345678 这样的顺序建立了一棵像树一样的,如果直接从初态不进行转变的话,那么我们的结果可能有很多的走法,有可能是先走A或B都可以到目标,有多条路时,但是先走了B的路径,必须要输出小的也就是从A开始的那条路,那怎么办呢,就可以用转化的思想了,把初始状态变成12345678,这样的话,我们一开始就是从这样的顺序算出来的!!所以必须先进行转换,在从目标往上找并记下路径,一直找到最终父节点:12345678.

这题映射之后直接一次BFS就行了...非常NB。。

///X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! a[i]表示第i个元素的逆序数
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <string>
#include <map>
using namespace std;
const int N = ;
int a[],b[];
char str[],str1[];
bool vis[N];
int fab[]={,,,,,,,};
struct Node
{
int val[];
int Hash;
};
struct Way{
char way; ///记录路径
int pre;
}node2[N];
int contor(Node s){
int x= ;
for(int i=;i>=;i--){
int cnt = ;
for(int j=i-;j>=;j--){
if(s.val[i]<s.val[j]) cnt++;
}
x+=cnt*fab[i-];
}
return x;
}
void A(Node &s){
swap(s.val[],s.val[]);
swap(s.val[],s.val[]);
swap(s.val[],s.val[]);
swap(s.val[],s.val[]);
}
void B(Node &s){
swap(s.val[],s.val[]),swap(s.val[],s.val[]),swap(s.val[],s.val[]);
swap(s.val[],s.val[]),swap(s.val[],s.val[]),swap(s.val[],s.val[]);
}
void C(Node &s){
swap(s.val[],s.val[]),swap(s.val[],s.val[]),swap(s.val[],s.val[]);
}
void bfs(Node s)
{
for(int i=;i<N;i++){
node2[i].pre = -;
}
memset(vis,false,sizeof(vis));
queue<Node> q;
node2[s.Hash].pre = -;
vis[s.Hash] = true;
q.push(s);
while(!q.empty()){
Node now = q.front();
q.pop();
Node next;
next = now;
A(next);
int k = contor(next);
if(!vis[k]){
vis[k] = true;
next.Hash = k;
node2[next.Hash].pre = now.Hash;
node2[next.Hash].way = 'A';
q.push(next);
}
next = now;
B(next);
k = contor(next);
if(!vis[k]){
vis[k] = true;
next.Hash = k;
node2[next.Hash].pre = now.Hash;
node2[next.Hash].way = 'B';
q.push(next);
}
next = now;
C(next);
k = contor(next);
if(!vis[k]){
vis[k] = true;
next.Hash = k;
node2[next.Hash].pre = now.Hash;
node2[next.Hash].way = 'C';
q.push(next);
}
}
}
struct Node3{
char c;
int idx;
}node3[];
void dfs(int x){
if(node2[x].pre==-) return;
dfs(node2[x].pre);
printf("%c",node2[x].way);
}
int main()
{
Node s;
for(int i=;i<=;i++){
s.val[i] = i;
}
s.Hash = contor(s);
bfs(s);
while(scanf("%s",str+)!=EOF)
{
scanf("%s",str1+);
for(int i=;i<=;i++){
node3[i].c = str[i];
node3[i].idx = i;
}
Node s;
for(int i=;i<=;i++){
for(int j=;j<=;j++){
if(str1[i]==node3[j].c){
s.val[i] = node3[j].idx;
break;
}
}
}
int x= contor(s);
dfs(x);
printf("\n");
}
}

hdu 1430(BFS+康托展开+映射+输出路径)的更多相关文章

  1. hdu 1430 (BFS 康托展开 或 map )

    第一眼看到这题就直接BFS爆搜,第一发爆了内存,傻逼了忘标记了,然后就改,咋标记呢. 然后想到用map函数,就8!个不同的排列,换成字符串用map标记.然后又交一发果断超时,伤心,最恨超时,还不如来个 ...

  2. hdu 5012 bfs 康托展开

    Dice Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

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

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

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

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

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

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

  6. HDU 1043 Eight(双向BFS+康托展开)

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...

  7. 【HDU - 1043】Eight(反向bfs+康托展开)

    Eight Descriptions: 简单介绍一下八数码问题:在一个3×3的九宫格上,填有1~8八个数字,空余一个位置,例如下图: 1 2 3 4 5 6 7 8   在上图中,由于右下角位置是空的 ...

  8. POJ 1077 && HDU 1043 Eight A*算法,bfs,康托展开,hash 难度:3

    http://poj.org/problem?id=1077 http://acm.hdu.edu.cn/showproblem.php?pid=1043 X=a[n]*(n-1)!+a[n-1]*( ...

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

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

随机推荐

  1. JavaScript定义类的方式与其它OO语言有些差异

    JavaScript面向对象的程序编写与其它OO语言有一些出入,所以使用JavaScript的面向对象特性的时候,需要注意一些规范性的问题.下面就简单地谈一下,JavaScript如何定义一个类,在定 ...

  2. Wireshark中TCP segment of a reassembled PDU的含义

    By francis_hao    Sep 16,2017   在用Wireshark抓包的时候,经常会看到TCP segment of a reassembled PDU,字面意思是要重组的协议数据 ...

  3. linux查找文件目录及mysql卸载

    我们要卸载 mysql但是不知道其安装在哪里了,可以用  where +关键词 的方式查找,如上图 输入 whereis mysql 后,下面显示出了4个包含mysql的位置. ..... 查看安装m ...

  4. ASP.NET创建三层架构图解详细教程

    1.新建项目 2.创建Visual Studio解决方案 3.再创建项目 4.选择类库类型 5.依次创建bll(业务逻辑层),dal(数据访问层)和model(模型层也可以叫实体层) 6.添加一个网站 ...

  5. Maven命令行窗口指定settings.xml

    maven命令行窗口指定特定settings.xml 在命令行界面指定settings.xml,命令如下: mvn install --settings c:\user\settings.xml 例如 ...

  6. [SCOI2009]生日礼物

    https://www.luogu.org/problem/show?pid=2564 题目描述 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x ...

  7. [洛谷P4774] [NOI2018]屠龙勇士

    洛谷题目链接:[NOI2018]屠龙勇士 因为markdown复制过来有点炸格式,所以看题目请戳上面. 题解: 因为杀死一条龙的条件是在攻击\(x\)次,龙恢复\(y\)次血量\((y\in N^{* ...

  8. html 制作静态页面新知识

    1.在区块线边框添加一条水平线 例如:<div  style:"height :300px;width:800px;border-bottom: solid 1px orange ;& ...

  9. error 0152: No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient'

    error 0152: No Entity Framework provider found for the ADO.NET provider with invariant name 'System. ...

  10. 设计模式之Builder

    设计模式总共有23种模式这仅仅是为了一个目的:解耦+解耦+解耦...(高内聚低耦合满足开闭原则) 介绍: Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象. 将一个复杂 ...