魔板

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

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
 
 
 
 
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<algorithm>
#include<queue>
using namespace std; string start,ans[];
int hash[]={};
bool vis[];
struct node
{
string c,step;
int val;
};
queue<node>Q; int ktzk(string s)
{
int i,j,sum = ;
for(i = ; i<; i++)
{
int cnt = ;
for(j = i+; j<; j++)
if(s[i]>s[j])
cnt++;
sum+=cnt*hash[-i];
}
return sum;
}
void bfs()
{
node cur,now;
char t[];
int i,k;
memset(vis,false,sizeof(vis));
cur.c=start;
cur.step="";
cur.val=ktzk(start);
ans[cur.val]="";
vis[cur.val]=true;
Q.push(cur);
while(!Q.empty())
{
cur=Q.front();
Q.pop();
now=cur;//A
for(i=;i<=;i++) swap(now.c[i],now.c[-i]); k=ktzk(now.c);
if(vis[k]==false)
{
vis[k]=true;
now.step+='A';
now.val=k;
ans[k]=now.step;
Q.push(now);
}
now=cur;//B
for(i=;i<;i++) t[i]=now.c[i];
now.c[]=t[];
now.c[]=t[];
now.c[]=t[];
now.c[]=t[];
now.c[]=t[];
now.c[]=t[];
now.c[]=t[];
now.c[]=t[]; k=ktzk(now.c);
if(vis[k]==false)
{
vis[k]=true;
now.step+='B';
now.val=k;
ans[k]=now.step;
Q.push(now);
}
now=cur;
for(i=;i<;i++) t[i]=now.c[i];
now.c[]=t[];
now.c[]=t[];
now.c[]=t[];
now.c[]=t[];
k=ktzk(now.c);
if(vis[k]==false)
{
vis[k]=true;
now.step+='C';
now.val=k;
ans[k]=now.step;
Q.push(now);
}
}
}
int main()
{
char a[],b[],cur[];
string hxl;
int i,j,k;
for(i=;i<=;i++)
hash[i]=hash[i-]*i;
start="";
bfs(); while(scanf("%s%s",a,b)>)
{
for(i=;i<;i++)
{
for(j=;j<;j++)
{
if(a[i]==b[j])
{
cur[j]=''+i;
}
}
}
cur[]='\0';
hxl="";
for(i=;i<;i++)
hxl+=cur[i];
k=ktzk(hxl);
cout<< ans[k] <<endl;
}
return ;
}

hdu 1430的更多相关文章

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

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

  2. hdu 1430+hdu 3567(预处理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1430 思路:由于只是8种颜色,所以标号就无所谓了,对起始状态重新修改标号为 12345678,对目标状 ...

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

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

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

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

  5. HDU 1430 关系映射 + 打表 .

    题意是中文的不解释.(http://acm.hdu.edu.cn/showproblem.php?pid=1430) 思路:            这个题目直接BFS会超时的(我一开始超时了) ,如果 ...

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

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

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

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

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

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

  9. [HDU 1430] 魔板

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

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

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

随机推荐

  1. Android------------------的资源文件的学习

    一.style的学习 用法: 使用: 使用系统自带的style的风格 使用: 效果: 二.drawable的使用 selector是一个xml文件进行加载使用的: 文件名叫做buttonselecto ...

  2. chrome 插件学习笔记(一)

    主要是屏蔽cnbeta中屏蔽广告之后的弹出层 manifest.json文件 { "js": ["jquery-1.7.2.min.js","cnbe ...

  3. 深入学习c++--左值引用和右值引用

    #include <iostream> #include <string> #include <vector> using namespace std; int m ...

  4. 975. Odd Even Jump

    You are given an integer array A.  From some starting index, you can make a series of jumps.  The (1 ...

  5. 根据已有的Jar包 一键生成对应的mavenpom.xml信息

    根据已有的jar包信息一键生成对应的maven坐标信息 .想一个问题 假如 我有一个SSH的项目, jar包是配置在lib中, 我现在想把它做成maven格式的SSH项目  ,那么这些jar包在mav ...

  6. python中实现三目运算

    python中没有其他语言中的三元表达式,不过有类似的实现方法 如: a = 1 b =2 k = 3 if a>b else 4 上面的代码就是python中实现三目运算的一个小demo, 如 ...

  7. mysql中date,datetime,timestamp数据类型区别

    (1)date表示日期,其范围为1000-01-01到9999-12-31 (2)datetime表示日期时间,其范围是1000-01-01 00:00:00到9999-12-31 23:59:59 ...

  8. Java并发编程之happens-before

    happens-before是JMM最核心的概念,理解happens-before是理解JMM的关键. 一.JMM的设计 首先,让我们先分析一下JMM的设计意图.从JMM的设计者的角度,在设计JMM的 ...

  9. 【JS深入学习】—— 一句话解释闭包

    闭包的定义: 闭包(closuer)是一个受到保护的变量空间,由内嵌函数构成.就是说闭包内的变量不能被外部函数访问,为什么会这样? 函数的作用域: JS具有函数级的作用域,这表明外部函数不能访问内部函 ...

  10. 网络请求 爬虫学习笔记 一 requsets 模块的使用 get请求和post请求初识别,代理,session 和ssl证书

    前情提要: 为了养家糊口,为了爱与正义,为了世界和平, 从新学习一个爬虫技术,做一个爬虫学习博客记录 学习内容来自各大网站,网课,博客. 如果觉得食用不良,你来打我啊 requsets 个人觉得系统自 ...