魔板

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 1679    Accepted Submission(s): 354

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
 


做这道题,首先要搞懂 康托展开,具体解释可戳→http://blog.csdn.net/lttree/article/details/24798653
我刚開始用BFS做,TLE。。。
后来改用双向BFS,发现WA。。。(我的双向BFS:http://blog.csdn.net/lttree/article/details/24811373
反正终于也没解决,好像是字典序的问题。

看网上其它人预处理一下。(就是打表)
然后这道题能够通过置换来解决:就是从一个状态到还有一个状态能够转换成从起点到某状态)
似懂非懂的感觉,后来看 青山绿水之辈 的博客懂了:

for( i=0;i<8;i++)
pos[s1[i]-'0']=i+1+'0';
for( i=0;i<8;i++)
s2[i]=pos[s2[i]-'0‘];

k=kangtuo(s2);

上面一段代码的意思是:把起始目标看成了1,2,3,4,5,6,7,8  ;

列如:位置:12345678                12345678

起初: 63728145       变      12345678

终点: 86372541       成       51234876

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

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

/**************************************
***************************************
* Author:Tree *
*From :http://blog.csdn.net/lttree *
* Title : 魔板 *
*Source: hdu 1430 *
* Hint : 康托展开 BFS *
***************************************
**************************************/
#include <iostream>
#include <string.h>
#include <string>
#include <queue>
using namespace std;
struct Node
{
string str,step;
};
bool vis[40320+1];
int pos[10],fac[] = {1,1,2,6,24,120,720,5040,40320};
// ans存从起点到达该点的答案
string ans[50000];
// 康托展开
int kangtuo(string a)
{
int i,j,t,sum;
sum=0;
for( i=0; i<8 ;++i)
{
t=0;
for(j=i+1;j<8;++j)
if( a[i]>a[j] )
++t;
sum+=t*fac[8-i-1];
}
return sum+1;
}
// 按A进行变换
void move_A(string &s)
{
for(int i=0;i<4;++i)
swap(s[i],s[i+4]);
}
// 按B进行变换
string move_B(string s)
{
string temp=s;
int i;
for(i=0;i<8;++i)
{
if( i==0 || i==4 ) temp[i]=s[i+3];
else temp[i]=s[i-1];
}
return temp;
}
// 按C进行变换
void move_C(string &s)
{
swap(s[1],s[2]);
swap(s[5],s[6]);
swap(s[1],s[6]);
}
void bfs( string s )
{
memset(vis,0,sizeof(vis));
queue <Node> q;
Node pre,lst; pre.str=s;
pre.step="";
vis[kangtuo(s)]=1;
ans[kangtuo(s)]=pre.step;
q.push( pre ); while( !q.empty() )
{
pre=q.front();
q.pop(); lst=pre;
move_A(lst.str);
if( !vis[kangtuo(lst.str)] )
{
lst.step+="A";
vis[kangtuo(lst.str)]=1;
ans[kangtuo(lst.str)]=lst.step;
q.push(lst);
} lst.str=move_B(pre.str);
if( !vis[kangtuo(lst.str)] )
{
lst.step=pre.step+"B";
vis[kangtuo(lst.str)]=1;
ans[kangtuo(lst.str)]=lst.step;
q.push(lst);
} lst=pre;
move_C(lst.str);
if( !vis[kangtuo(lst.str)] )
{
lst.step+="C";
vis[kangtuo(lst.str)]=1;
ans[kangtuo(lst.str)]=lst.step;
q.push(lst);
}
} }
int main()
{
int i,k;
string s1,s2;
// 预处理,从起点到各点。
bfs("12345678");
while( cin>>s1>>s2 )
{
// 将顺序改过来
// 题目中 12345678
// 事实上是 1234
// 8765
// 我们就依照 12348765来存储
swap(s1[4],s1[7]);
swap(s1[5],s1[6]);
swap(s2[4],s2[7]);
swap(s2[5],s2[6]);
for(i=0;i<8;i++)
pos[s1[i]-'0']=i+1;
for(i=0;i<8;i++)
s2[i]=pos[s2[i]-'0'];/*置换*/
k=kangtuo(s2);
cout<<ans[k]<<endl;
}
return 0;
}

ACM-康托展开+预处理BFS之魔板——hdu1430的更多相关文章

  1. 转换地图 (康托展开+预处理+BFS)

    Problem Description 在小白成功的通过了第一轮面试后,他来到了第二轮面试.面试的题目有点难度了,为了考核你的思维能量,面试官给你一副(2x4)的初态地图,然后在给你一副(2x4)的终 ...

  2. UESTC 485 Game(康托展开,bfs打表)

    Game Time Limit: 4000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Status t ...

  3. 康托展开+反向bfs

    康托展开+反向bfs hdu 1043 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1043 #include <iostream> # ...

  4. HDU1430 BFS + 打表 + 康托展开

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1430 , 一道比较好的题. 这道题要用到很多知识,康托展开.BFS.打表的预处理还要用到一一映射,做完 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. FZOJ--2212--Super Mobile Charger(水题)

    Problem 2212 Super Mobile Charger Accept: 3    Submit: 11 Time Limit: 1000 mSec    Memory Limit : 32 ...

  2. 36.创建自定义的指令directive

    转自:https://www.cnblogs.com/best/tag/Angular/ 1. <html> <head> <meta charset="utf ...

  3. 如何安装MySQL?(二)

    MYSQL的两种安装方式 MSI安装 ZIP安装 第一步: 第二步: 第三步: 这里我选择下载到桌面吧! 第四步: 第五步: 第六步: 第七步: 典型安装:除了安装MySQL的服务器,还安装MySQL ...

  4. HBase框架基础(四)

    * HBase框架基础(四) 上一节我们介绍了如何使用HBase搞一些MapReduce小程序,其主要作用呢是可以做一些数据清洗和分析或者导入数据的工作,这一节我们来介绍如何使用HBase与其他框架进 ...

  5. codeforces 400 C Inna and Huge Candy Matrix【模拟】

    题意:给出一个矩形的三种操作,顺时针旋转,逆时针旋转,对称,给出原始坐标,再给出操作数,问最后得到的坐标 画一下模拟一下操作就可以找到规律了 #include<iostream> #inc ...

  6. 洛谷1073 NOIP2009 最优贸易

    题目大意 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双 ...

  7. 前端之CSS属性相关

    宽和高 width属性可以为元素设置宽度. height属性可以为元素设置高度. 块级标签才能设置宽度,内联标签的宽度由内容来决定. 字体属性 文字字体 font-family可以把多个字体名称作为一 ...

  8. python ORM理解、元类

    元类 参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143191 ...

  9. socket 编程的端口和地址复用

    在linux socket网络编程中,大规模并发TCP或UDP连接时,经常会用到端口复用:   int opt = 1;   if(setsockopt(sockfd, SOL_SOCKET,SO_R ...

  10. type &#39;simple Class&#39; does not conform to protocol &#39;Example Protocol&#39;错误

    在看swift教程中"接口和扩展"这小部分. 在编写时提示"type 'simple Class' does not conform to protocol 'Examp ...