传送门

题意

给出初始序列与终止序列,给出三种操作,问最少经过几次操作能使初始->终止,输出操作(字典序最小)

分析

字符串只有8个字符,使用康托展开。

1.BFS将所有序列从"12345678"操作得到,能够保证字典序与次数最小(采用string)

2.接下来将初始序列变成"12345678",相应终止序列也变化,该操作由下列代码实现

  1. R(i,0,8) pos[s1[i]-'0']=i+1;
  2. R(i,0,8) s2[i]=pos[s2[i]-'0'];

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define F(i,a,b) for(int i=a;i<=b;++i)
  5. #define R(i,a,b) for(int i=a;i<b;++i)
  6. #define mem(a,b) memset(a,b,sizeof(a))
  7. #define cpy(a,b) memcpy(a,b,sizeof(b))
  8. string s1,s2,ans[100100];
  9. int a[10]={1,1,2,6,24,120,720,5040},pos[10];
  10. bool vis[100100];
  11. int cal(string &s)//cnt=a[i]*(n-i-1)!
  12. {
  13. int ret=0;
  14. R(i,0,7)
  15. {
  16. int tmp=0;
  17. R(j,i+1,8) if(s[i]>s[j]) tmp++;
  18. ret+=tmp*a[7-i];
  19. }
  20. //printf("ret=%d\n",ret);
  21. return ret;
  22. }
  23. struct node
  24. {
  25. string s;
  26. int value;
  27. };
  28. void op1(string &s)
  29. {
  30. F(i,1,4) swap(s[i-1],s[8-i]);
  31. }
  32. void op2(string &s)
  33. {
  34. for(int i=3;i;--i) swap(s[i],s[i-1]);
  35. for(int i=4;i<7;++i) swap(s[i],s[i+1]);
  36. }
  37. void op3(string &s)
  38. {
  39. swap(s[1],s[6]);swap(s[6],s[5]);swap(s[2],s[5]);
  40. }
  41. queue<node>q;
  42. void bfs()
  43. {
  44. string s="12345678";
  45. node p;
  46. p.s=s;
  47. p.value=cal(s);
  48. vis[p.value]=1;
  49. ans[p.value]="";
  50. q.push(p);
  51. while(!q.empty())
  52. {
  53. //puts("1");
  54. p=q.front();q.pop();
  55. //if(vis[p.value]) continue;
  56. F(i,1,3)
  57. {
  58. if(i==1)
  59. {
  60. node pp=p;
  61. op1(pp.s);
  62. pp.value=cal(pp.s);
  63. if(!vis[pp.value])
  64. {
  65. vis[pp.value]=1;ans[pp.value]=ans[p.value]+'A';
  66. q.push(pp);
  67. }
  68. }
  69. if(i==2)
  70. {
  71. node pp=p;
  72. op2(pp.s);
  73. pp.value=cal(pp.s);
  74. if(!vis[pp.value])
  75. {
  76. vis[pp.value]=1;ans[pp.value]=ans[p.value]+'B';
  77. q.push(pp);
  78. }
  79. }
  80. if(i==3)
  81. {
  82. node pp=p;
  83. op3(pp.s);
  84. pp.value=cal(pp.s);
  85. if(!vis[pp.value])
  86. {
  87. vis[pp.value]=1;ans[pp.value]=ans[p.value]+'C';
  88. q.push(pp);
  89. }
  90. }
  91. }
  92. }
  93. }
  94. int main()
  95. {
  96. bfs();
  97. while(cin>>s1>>s2)
  98. {
  99. R(i,0,8) pos[s1[i]-'0']=i+1;
  100. R(i,0,8) s2[i]=pos[s2[i]-'0'];
  101. cout<<ans[cal(s2)]<<endl;
  102. }
  103. return 0;
  104. }

HDU1430;魔板(BFS+康托展开)的更多相关文章

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

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

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

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

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

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

  4. hdu1430 魔板(康拓展开 bfs预处理)

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

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

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

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

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

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

    # 10027. 「一本通 1.4 例 2」魔板 [题目描述] Rubik 先生在发明了风靡全球魔方之后,又发明了它的二维版本--魔板.这是一张有 888 个大小相同的格子的魔板: 1 2 3 4 8 ...

  8. HDU_1430 魔板 【BFS+康托展开+置换】

    一.题面 POJ1430 二.分析 该题与之前做的八数码不同,它是一个2*4的棋盘,并且没有空的区域.这样考虑的情况是很少的,依然结合康托展开,这时康托展开最多也只乘7的阶乘,完全可以BFS先预处理一 ...

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

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

随机推荐

  1. 洛谷 P4720 【模板】扩展 / 卢卡斯 模板题

    扩展卢卡斯定理 : https://www.luogu.org/problemnew/show/P4720 卢卡斯定理:https://www.luogu.org/problemnew/show/P3 ...

  2. 动态规划:HDU 1114 Piggy-Bank

    Problem Description Before ACM can do anything, a budget must be prepared and the necessary financia ...

  3. maven 新建项目时修改默认jre路径

    新建maven项目时,JRE System Library默认为J2SE-1.5 如果想修改为1.7,修改maven的settings.xml ,在profiles中添加 <profile> ...

  4. matlab 画图技巧

    基本画图工具:matlab 画图中线型及颜色设置 matlab中坐标轴设置技巧 **Matlab中的坐标轴设置技巧**    axisoff;      %去掉坐标轴  axistight;      ...

  5. Android双列滑动表格(双表头不动)

    ※效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGluZ2xvbmd4aW4yNA==/font/5a6L5L2T/fontsize/400/fil ...

  6. 火狐浏览器Firefox 如何下载网页的SWF视频,硅谷动力的网站视频怎么下载

    1 使用火狐浏览器查看到底视频在哪里,我随便开了一段视频,发现这个SWF(外框套了一个Control.swf,内层才是真实的09-class.swf)   2 我们从下面这一段代码中进行分析 < ...

  7. VC++中的int main(int argc, char argv[])是什么意思

    这是C/C++的一重要函数,叫主函数.无论程序多复杂,代码中必须有这么一个函数,也只能有一个这样的函数:程序执行时就是从这个函数进入的.由于问得比较笼统,如果你想知道详细情况的话,发给你一个网友的求助 ...

  8. 微信小程序之 SideBar(侧栏分类)

    项目目录: 模拟数据: utils / data.js function getSData() { var data = [ { "id": 1, "tree" ...

  9. hadoop生态系统学习之路(十)MR将结果输出到hbase

    之前讲了MR将结果输出到hdfs.hive.db,今天再给大家分享一下,怎样将结果输出到hbase. 首先,提一句,笔者在hadoop集群运行此MR的时候报了一个错误.是一个jar包的缘故,这个错误是 ...

  10. iOS 开发小常识 开发笔记

    一   自定义push方法 /*  参数说明 *  controllerName : push的目标页 例:@“testcontroll”    ---注意不带.h *  isNibPage     ...