魔板

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. Day4 作业

    a=[1,2,3,6,"dfs",100]s=a[-1:]print (s)答案:[100] s=a[-1:0:-1]print(s) 答案:[100, 'dfs', 6, 3, ...

  2. Minimax-486. Predict the Winner

    Given an array of scores that are non-negative integers. Player 1 picks one of the numbers from eith ...

  3. 刚才在windows下发现拖拽不了文件了

    百度了下  摁了两下esc就可以了.以下是百度得到的答案 按几下Esc目的是:没按前ESC键[接触不好]或[键不灵]或其他原因导致ESC处于[按下]状态,这样鼠标就会拖不了文件,点击菜单也会马上消失, ...

  4. [Swift实际操作]七、常见概念-(11)路径URL的使用详解

    本文将为你演示网址对象(URL)的使用 首先导入需要使用的界面工具框架 import UIKit 接着初始化一个指定网址的网址对象 let url = URL(string: "https: ...

  5. php判断是否使用手机访问

    直接上代码 /** * 检测是否使用手机访问 * @access public * @return bool */ public function isMobile() { if (isset($_S ...

  6. Centos7下安装zabbix 3.0.19

    参考网站: https://www.cnblogs.com/xiewenming/p/7732144.html https://www.cnblogs.com/clsn/p/7885990.html  ...

  7. 课程一(Neural Networks and Deep Learning),第一周(Introduction to Deep Learning)—— 1、经常提及的问题

    Frequently Asked Questions Congratulations to be part of the first class of the Deep Learning Specia ...

  8. vue-devtools必备工具

    1.github下载地址:https://github.com/vuejs/vue-devtools 2.下载安成之后打开cmd进入vue-devtools文件夹把依赖装好npm install 之后 ...

  9. JDBC链接oracle数据库

    package test; import java.sql.* ; public class JDBC_Test { //orcl为oracle数据库中的数据库名,localhost表示连接本机的or ...

  10. 纯C++安卓开发 (ndk)系列之 ---- 常见问题

    常见问题1:run as Android Application运行时提示无法识别到模拟器 解决步骤如下: (1)首先查看安卓模拟器是否已经打开 (2)如果安卓模拟器已经打开,则操作步骤为:点击Ecl ...