搜索水题。因为只有8个数,排列一共有40320种,直接bfs,判重就行了。

但是判重的时候直接用8进制表示的话要88的bool数组。这种操作太low了,于是我们可以用康托展开,降成8!。

康托展开其实就是一个简单的公式,很好意会。。。。

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <queue>
  4. #include <cstdio>
  5. #include <cstring>
  6. using namespace std;
  7. const int fac[]={,,,,,,,,,};
  8. int rnk;
  9. bool vis[];
  10. struct Node{
  11. int a[],step,pre;
  12. char c;
  13. }a,q[];
  14. int cantor(Node b) {
  15. int ans=;
  16. for(int i=;i<=;i++) {
  17. int cnt=;
  18. for(int j=i+;j<=;j++) {
  19. if(b.a[j]<b.a[i]) cnt++;
  20. }
  21. ans+=(cnt*fac[-i]);
  22. }
  23. return ans;
  24. }
  25. Node A(Node x) {
  26. for(int i=;i<=;i++) swap(x.a[i],x.a[-i]);
  27. return x;
  28. }
  29. Node B(Node x) {
  30. swap(x.a[],x.a[]),swap(x.a[],x.a[]);
  31. swap(x.a[],x.a[]),swap(x.a[],x.a[]);
  32. swap(x.a[],x.a[]),swap(x.a[],x.a[]);
  33. return x;
  34. }
  35. Node C(Node x) {
  36. swap(x.a[],x.a[]),swap(x.a[],x.a[]),swap(x.a[],x.a[]);
  37. return x;
  38. }
  39. int h,t;
  40. void print(Node x) {
  41. if(!x.pre) return;
  42. print(q[x.pre]); printf("%c",x.c);
  43.  
  44. }
  45. void bfs() {
  46. h++,t++;
  47. for(int i=;i<;i++)q[].a[i]=i;
  48. while(h<=t) {
  49. bool flag=;
  50. for(int i=;i<=;i++) if(q[h].a[i]!=a.a[i]) {flag=;break;}
  51. if(flag) {printf("%d\n",q[h].step),print(q[h]);exit();}
  52. Node tp;int kt;
  53. tp=A(q[h]);kt=cantor(tp);
  54. if(!vis[kt]){vis[kt]=;q[++t]=tp;q[t].step++,q[t].pre=h;q[t].c='A';}
  55. tp=B(q[h]);kt=cantor(tp);
  56. if(!vis[kt]){vis[kt]=;q[++t]=tp;q[t].step++;q[t].pre=h;q[t].c='B';}
  57. tp=C(q[h]);kt=cantor(tp);
  58. if(!vis[kt]){vis[kt]=;q[++t]=tp;q[t].step++;q[t].pre=h;q[t].c='C';}
  59. h++;
  60. }
  61. }
  62. int main() {
  63. for(int i=;i<=;i++) scanf("%d",&a.a[i]);
  64. bfs();
  65. }

Magic Squares

[LUOGU2730] 魔板的更多相关文章

  1. Sicily 1051: 魔板(BFS+排重)

    相对1150题来说,这道题的N可能超过10,所以需要进行排重,即相同状态的魔板不要重复压倒队列里,这里我用map储存操作过的状态,也可以用康托编码来储存状态,这样时间缩短为0.03秒.关于康托展开可以 ...

  2. Sicily 1150: 简单魔板(BFS)

    此题可以使用BFS进行解答,使用8位的十进制数来储存魔板的状态,用BFS进行搜索即可 #include <bits/stdc++.h> using namespace std; int o ...

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

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

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

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

  5. [HDU 1430] 魔板

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

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

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

  7. Sicily1151:魔板搜索及优化

    最终优化代码地址: https://github.com/laiy/Datastructure-Algorithm/blob/master/sicily/1151.c 题目如下 Constraints ...

  8. 【USACO 3.2.5】魔板

    [描述] 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前8个 ...

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

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

随机推荐

  1. SQL Server 运行计划操作符具体解释(2)——串联(Concatenation )

    本文接上文:SQL Server 运行计划操作符具体解释(1)--断言(Assert) 前言: 依据计划.本文開始讲述另外一个操作符串联(Concatenation).读者能够依据这个词(中英文均可) ...

  2. CLLocationManagerDelegate的解说

    1.//新的方法.登陆成功之后(旧的方法就无论了) - (void)locationManager:(CLLocationManager *)manager      didUpdateLocatio ...

  3. 11gR2 Database Services for &quot;Policy&quot; and &quot;Administrator&quot; Managed Databases (文档 ID 1481647.1)

    In this Document   Purpose   _afrLoop=1459311711568804&id=1481647.1&displayIndex=6&_afrW ...

  4. ios swift学习日记4-字符串和字符

    近期ios的swift语言好像火了起来,本人没有objectc的基础,但之前是有c跟java的基础的. 从这几天開始学习ios的swift语言,后期以博客形式公布.这里提供一本翻译的英文版的swif书 ...

  5. contest hunter5105 Cookies

    神题 先按贪婪值大到小排序,根据贪心的思想g[i]越大a[i]也越大(这个微扰可以证,给个提示,a>b且c<d 则 (a-b)(c-d)<0 则 ac+bd<ad+bc) DP ...

  6. Possible multiple enumeration of IEnumerable

    https://www.jetbrains.com/help/resharper/2016.1/PossibleMultipleEnumeration.html Consider the follow ...

  7. CNN中的局部连接(Sparse Connectivity)和权值共享

    局部连接与权值共享 下图是一个很经典的图示,左边是全连接,右边是局部连接. 对于一个1000 × 1000的输入图像而言,如果下一个隐藏层的神经元数目为10^6个,采用全连接则有1000 × 1000 ...

  8. poj--2553--The Bottom of a Graph (scc+缩点)

    The Bottom of a Graph Time Limit : 6000/3000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Oth ...

  9. 【NOIP 2009】 Hankson的趣味题

    [题目链接] https://www.luogu.org/problemnew/show/P1072 [算法] x是b1的约数 筛出b1的约数,判断是否符合条件即可 [代码] #include< ...

  10. 用fiddler不能抓取https及证书无法导出

    本次说的不是首次安装fiddler 1.不管有没有安装成功,先查看有没有安装过证书,有的话删除,重新进行安装 打开fiddler,找到Tools-HTTPS-Athons-Open windows C ...