魔板

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. List of content management systems

    https://en.wikipedia.org/wiki/List_of_content_management_systems Microsoft ASP.NET Name Platform Sup ...

  2. MongoDB Shell (mongo)

    https://docs.mongodb.com/getting-started/shell/client/ The mongo shell is an interactive JavaScript ...

  3. [NOIP2015模拟10.22] 最小代价 解题报告 (最小生成树)

    Description 给出一幅由n个点m条边构成的无向带权图.其中有些点是黑点,其他点是白点.现在每个白点都要与他距离最近的黑点通过最短路连接(如果有很多个黑点,可以选取其中任意一个),我们想要使得 ...

  4. WebBrowser获取页面总高度

    case DISPID_DOCUMENTCOMPLETE: { #pragma region 获取页面总高度 HRESULT hr; IDispatch *pdisp; hr = m_pWebBrow ...

  5. React ----- 路由懒加载的几种实现方案

    传统的两种方式 1.import() 符合ECMAScript提议的import()语法,该提案与普通 import 语句或 require 函数的类似,但返回一个 Promise 对象.这意味着模块 ...

  6. Tuples as return values

    Strictly speaking, a function can only return one value, but if the value is a tuple, the effect is ...

  7. mysql InnoDB引擎 共享表空间和独立表空间(转载)

    PS:innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等.对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间. 1.什么是共享表空间和独占表空 ...

  8. json数据字典,以及数据在下拉框中显示

    建立person_vocation.json数据字典文件,内容: [ {"id":1,"disabled":false,"selected" ...

  9. 【DNN 系列】 MVC 分页

    MVC分页可采用插件形式, 有MvcPage那个插件但是我觉得那个是假分页 有点影响效率 所以网上找了一个例子来 做分页 1, PagerQuery.cs public class PagerQuer ...

  10. Swift学习笔记(2):错误处理

    目录: Error do-catch 断言 Error 在 Swift 中,错误用符合 Error 协议的类型的值来表示.这个空协议表明该类型可以用于错误处理异常. Swift 的枚举类型尤为适合构建 ...