第一眼看到这题就直接BFS爆搜,第一发爆了内存,傻逼了忘标记了,然后就改,咋标记呢。

然后想到用map函数,就8!个不同的排列,换成字符串用map标记。然后又交一发果断超时,伤心,最恨超时,还不如来个wa算了。

然后卡着了,后来上网上搜,要用康托展开,康托展开是什么鬼?然后学习了一下,就是个映射,感觉和map差不多。

http://blog.csdn.net/zhongkeli/article/details/6966805这个学习一下康托展开。

其实本题的关键不是康托展开,而是置换。

以12345678为起始状态开始搜它经过3种变换能到达的所有状态的最小步数,每搜到一个记录下来,可以用康托展开,也可以用C++ STL库里的map

所以只要搜一次就够了,然后记录。那么咋转置呢。举个列子 初态为65871234 目标态为87125463,那么初态和12345678比较,6和1对应,5和2对应

8和3对应......,所以目标态的8为初态的第三位,而初态的第三位对应12345678中的三,所以目标态第一位转为3,同理第2位转为4......

最后的到状态为34562817,所以只要知道12345678转为34562817的最小步数就为所求。

下面给两段代码一个是用map写的一个是用康托展开写的。map写的运行时间比较慢200多Ms,不过时间足够,题目好像是给了5s吧,

康托展开是46ms.

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1430;

  1. 1 #include<stdio.h>
  2. 2 #include<algorithm>
  3. 3 #include<iostream>
  4. 4 #include<string.h>
  5. 5 #include<stdlib.h>
  6. 6 #include<math.h>
  7. 7 #include<queue>
  8. 8 #include<stack>
  9. 9 #include<cstdio>
  10. 10 #include<map>
  11. 11 void bfs();
  12. 12 using namespace std;
  13. 13 void AA(char *p,char *q);
  14. 14 void BB(char *p,char *q);
  15. 15 void CC(char *p,char *q);
  16. 16 int N=50005;
  17. 17 map<string,int>my;
  18. 18 char t[10]="12345678";
  19. 19 char a[41000][100];//总共有8!的状态每个状态对应一个数然后用数组存变换的步奏
  20. 20 typedef struct pp
  21. 21 {
  22. 22
  23. 23 char ab[10];
  24. 24 int n;
  25. 25
  26. 26 } ss;//开结构体存步数。
  27. 27 int main(void)
  28. 28 {
  29. 29
  30. 30 int n,i,j,k,p,q;
  31. 31 char aa[10];
  32. 32 char bb[10];
  33. 33 char cc[10];
  34. 34 bfs();
  35. 35 while(scanf("%s %s",aa,bb)!=EOF)
  36. 36 {
  37. 37 int yu=0;
  38. 38 for(i=0; i<8; i++)
  39. 39 {
  40. 40 for(j=0; j<8; j++)
  41. 41 {
  42. 42 if(bb[i]==aa[j])
  43. 43 {
  44. 44 cc[yu++]=j+1+'0';
  45. 45 }
  46. 46 }
  47. 47 }
  48. 48 cc[8]='\0';
  49. 49 int sh=my[cc];
  50. 50 puts(a[sh]);
  51. 51 }
  52. 52 return 0;
  53. 53
  54. 54 }
  55. 55 void bfs()
  56. 56 {
  57. 57 int i,j,k,p,q,l;
  58. 58 ss ll,mm;
  59. 59 ll.n=1;
  60. 60 int v=1;
  61. 61 my[t]=v;//map标记并映射为一个数
  62. 62 v++;
  63. 63 strcpy(ll.ab,t);
  64. 64 queue<ss>que;
  65. 65 que.push(ll);
  66. 66 while(!que.empty())
  67. 67 {
  68. 68 mm=que.front();
  69. 69 que.pop();
  70. 70 ss pp;
  71. 71 AA(pp.ab,mm.ab);
  72. 72
  73. 73 if(my[pp.ab]==0)
  74. 74 {
  75. 75 my[pp.ab]=v;
  76. 76 strcpy(a[v],a[mm.n]);//接上一个所有的变化步数
  77. 77 l=strlen(a[v]);//最后加上本次的变换
  78. 78 a[v][l]='A';
  79. 79 pp.n=v;
  80. 80 v++;
  81. 81 que.push(pp);
  82. 82 }
  83. 83 BB(pp.ab,mm.ab);
  84. 84
  85. 85 if(my[pp.ab]==0)
  86. 86 {
  87. 87 my[pp.ab]=v;
  88. 88 strcpy(a[v],a[mm.n]);
  89. 89 l=strlen(a[v]);
  90. 90 a[v][l]='B';
  91. 91
  92. 92 pp.n=v;
  93. 93 v++;
  94. 94 que.push(pp);
  95. 95 }
  96. 96 CC(pp.ab,mm.ab);
  97. 97
  98. 98 if(my[pp.ab]==0)
  99. 99 {
  100. 100 my[pp.ab]=v;
  101. 101 strcpy(a[v],a[mm.n]);
  102. 102 l=strlen(a[v]);
  103. 103 a[v][l]='C';
  104. 104 pp.n=v;
  105. 105 v++;
  106. 106 que.push(pp);
  107. 107 }
  108. 108
  109. 109
  110. 110
  111. 111
  112. 112 }
  113. 113
  114. 114
  115. 115
  116. 116
  117. 117
  118. 118
  119. 119 }//三种不同的转换;
  120. 120 void AA(char *p,char *q)
  121. 121 {
  122. 122 int i,j,k;
  123. 123 p[0]=q[7];
  124. 124 p[1]=q[6];
  125. 125 p[2]=q[5];
  126. 126 p[3]=q[4];
  127. 127 p[4]=q[3];
  128. 128 p[5]=q[2];
  129. 129 p[6]=q[1];
  130. 130 p[7]=q[0];
  131. 131 p[8]='\0';
  132. 132 }
  133. 133
  134. 134 void BB(char *p,char *q)
  135. 135 {
  136. 136 int i,j,k;
  137. 137 p[0]=q[3];
  138. 138 p[1]=q[0];
  139. 139 p[2]=q[1];
  140. 140 p[3]=q[2];
  141. 141 p[4]=q[5];
  142. 142 p[5]=q[6];
  143. 143 p[6]=q[7];
  144. 144 p[7]=q[4];
  145. 145 p[8]='\0';
  146. 146 }
  147. 147
  148. 148 void CC(char *p,char *q)
  149. 149 {
  150. 150 p[0]=q[0];
  151. 151 p[1]=q[6];
  152. 152 p[2]=q[1];
  153. 153 p[3]=q[3];
  154. 154 p[4]=q[4];
  155. 155 p[5]=q[2];
  156. 156 p[6]=q[5];
  157. 157 p[7]=q[7];
  158. 158 p[8]='\0';
  159. 159 }
  1. 1 #include<stdio.h>
  2. 2 #include<algorithm>
  3. 3 #include<iostream>
  4. 4 #include<string.h>
  5. 5 #include<stdlib.h>
  6. 6 #include<math.h>
  7. 7 #include<queue>
  8. 8 #include<stack>
  9. 9 #include<cstdio>
  10. 10 int kt(char *p);
  11. 11 void bfs();
  12. 12 using namespace std;
  13. 13 void AA(char *p,char *q);
  14. 14 void BB(char *p,char *q);
  15. 15 void CC(char *p,char *q);
  16. 16 int as[10];
  17. 17 int N=50005;
  18. 18 bool vis[50005];
  19. 19 char t[10]="12345678";
  20. 20 char a[41000][100];
  21. 21 typedef struct pp
  22. 22 {
  23. 23 char ab[10];
  24. 24 int n;
  25. 25
  26. 26 } ss;
  27. 27 int main(void)
  28. 28 {
  29. 29 as[0]=1;
  30. 30 as[1]=1;
  31. 31 as[2]=2;
  32. 32 as[3]=6;
  33. 33 as[4]=24;
  34. 34 as[5]=120;
  35. 35 as[6]=720;
  36. 36 as[7]=5040;//康托展开预处理
  37. 37 int n,i,j,k,p,q;
  38. 38 char aa[10];
  39. 39 char bb[10];
  40. 40 char cc[10];
  41. 41 memset(vis,0,sizeof(vis));
  42. 42 bfs();
  43. 43 while(scanf("%s %s",aa,bb)!=EOF)
  44. 44 {
  45. 45 int yu=0;
  46. 46 for(i=0; i<8; i++)
  47. 47 {
  48. 48 for(j=0; j<8; j++)
  49. 49 {
  50. 50 if(bb[i]==aa[j])
  51. 51 {
  52. 52 cc[yu++]=j+1+'0';
  53. 53 }
  54. 54 }
  55. 55 }
  56. 56
  57. 57 int sh=kt(cc);
  58. 58
  59. 59 puts(a[sh]);
  60. 60 }
  61. 61
  62. 62 return 0;
  63. 63
  64. 64 }
  65. 65
  66. 66 int kt(char *p)//康托展开
  67. 67 {
  68. 68 int i,j;
  69. 69 int kk=0;
  70. 70 for(i=0; i<8; i++)
  71. 71 {
  72. 72 int yy=0;
  73. 73 for(j=i+1; j<8; j++)
  74. 74 {
  75. 75 if((p[i]-'0')>(p[j]-'0'))
  76. 76 {
  77. 77 yy++;
  78. 78 }
  79. 79 }
  80. 80 kk+=yy*as[7-i];
  81. 81
  82. 82
  83. 83 }
  84. 84 return kk;
  85. 85 }
  86. 86
  87. 87 void bfs()
  88. 88 {
  89. 89 int i,j,k,p,q,l;
  90. 90 ss ll,mm;
  91. 91 ll.n=0;
  92. 92 vis[0]=true;
  93. 93 strcpy(ll.ab,t);
  94. 94 queue<ss>que;
  95. 95 que.push(ll);
  96. 96 while(!que.empty())
  97. 97 {
  98. 98 mm=que.front();
  99. 99 que.pop();
  100. 100 ss pp;
  101. 101 AA(pp.ab,mm.ab);
  102. 102 int yy=kt(pp.ab);
  103. 103 if(!vis[yy])
  104. 104 {
  105. 105 vis[yy]=true;
  106. 106 strcpy(a[yy],a[mm.n]);
  107. 107 l=strlen(a[yy]);
  108. 108 a[yy][l]='A';
  109. 109 pp.n=yy;
  110. 110 que.push(pp);
  111. 111 }
  112. 112 BB(pp.ab,mm.ab);
  113. 113 yy=kt(pp.ab);
  114. 114 if(!vis[yy])
  115. 115 {
  116. 116 vis[yy]=true;
  117. 117 strcpy(a[yy],a[mm.n]);
  118. 118 l=strlen(a[yy]);
  119. 119 a[yy][l]='B';
  120. 120 pp.n=yy;
  121. 121 que.push(pp);
  122. 122 }
  123. 123 CC(pp.ab,mm.ab);
  124. 124 yy=kt(pp.ab);
  125. 125 if(!vis[yy])
  126. 126 {
  127. 127 vis[yy]=true;
  128. 128 strcpy(a[yy],a[mm.n]);
  129. 129 l=strlen(a[yy]);
  130. 130 a[yy][l]='C';
  131. 131 pp.n=yy;
  132. 132 que.push(pp);
  133. 133 }
  134. 134
  135. 135
  136. 136
  137. 137
  138. 138 }
  139. 139
  140. 140
  141. 141
  142. 142
  143. 143
  144. 144 }
  145. 145 void AA(char *p,char *q)
  146. 146 {
  147. 147 int i,j,k;
  148. 148 p[0]=q[7];
  149. 149 p[1]=q[6];
  150. 150 p[2]=q[5];
  151. 151 p[3]=q[4];
  152. 152 p[4]=q[3];
  153. 153 p[5]=q[2];
  154. 154 p[6]=q[1];
  155. 155 p[7]=q[0];
  156. 156 }
  157. 157
  158. 158 void BB(char *p,char *q)
  159. 159 {
  160. 160 int i,j,k;
  161. 161 p[0]=q[3];
  162. 162 p[1]=q[0];
  163. 163 p[2]=q[1];
  164. 164 p[3]=q[2];
  165. 165 p[4]=q[5];
  166. 166 p[5]=q[6];
  167. 167 p[6]=q[7];
  168. 168 p[7]=q[4];
  169. 169 }
  170. 170
  171. 171 void CC(char *p,char *q)
  172. 172 {
  173. 173 p[0]=q[0];
  174. 174 p[1]=q[6];
  175. 175 p[2]=q[1];
  176. 176 p[3]=q[3];
  177. 177 p[4]=q[4];
  178. 178 p[5]=q[2];
  179. 179 p[6]=q[5];
  180. 180 p[7]=q[7];
  181. 181 }

hdu 1430 (BFS 康托展开 或 map )的更多相关文章

  1. hdu 1430(BFS+康托展开+映射+输出路径)

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

  2. hdu 5012 bfs 康托展开

    Dice Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

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

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

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

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

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

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

  6. HDU 1043 Eight(双向BFS+康托展开)

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...

  7. 【HDU - 1043】Eight(反向bfs+康托展开)

    Eight Descriptions: 简单介绍一下八数码问题:在一个3×3的九宫格上,填有1~8八个数字,空余一个位置,例如下图: 1 2 3 4 5 6 7 8   在上图中,由于右下角位置是空的 ...

  8. POJ 1077 && HDU 1043 Eight A*算法,bfs,康托展开,hash 难度:3

    http://poj.org/problem?id=1077 http://acm.hdu.edu.cn/showproblem.php?pid=1043 X=a[n]*(n-1)!+a[n-1]*( ...

  9. POJ 1077 Eight (BFS+康托展开)详解

    本题知识点和基本代码来自<算法竞赛 入门到进阶>(作者:罗勇军 郭卫斌) 如有问题欢迎巨巨们提出 题意:八数码问题是在一个3*3的棋盘上放置编号为1~8的方块,其中有一块为控制,与空格相邻 ...

随机推荐

  1. MongoDB的搭建、参数

    Mongodb官网:https://www.mongodb.com/ mkdir -r  /data/db touch  /data/log tar -zxvf mongodb-linux-x86_6 ...

  2. 12-gauge/bore shotgun

    12-gauge/bore shotgun不是弹夹(magazine)容量为12发的霰(xian)弹枪.[LDOCE]gauge - a measurement of the width or thi ...

  3. pyqt5 的串口编写进度

    2020.12.18 今天遇到一个问题, 想用回车实现串口数据的发送. 下面这句话是让光标移动到文字的尾部,但是不能够实现. 对QTextEdit控件中的文字改写,或清除后,再调用下面的移动到尾部,就 ...

  4. 容器之分类与各种测试(四)——map

    map和set的区别在于,前者key和value是分开的,前者的key不会重复,value可以重复:后者的key即为value,后者的value不允许重复.还有,map在插入时可以使用 [ ]进行(看 ...

  5. Oracle异常处理——ORA-01502:索引或这类索引的分区处于不可用状态

    Oracle异常处理--ORA-01502:索引或这类索引的分区处于不可用状态参考自:https://www.cnblogs.com/lijiaman/p/9277149.html 1.原因分析经过查 ...

  6. ORACLE中dual用法详解

    基本上oracle引入dual为的就是符合语法1. 我们先从名称来说,dual不是缩写词,本身就是完整的单词.dual名词意思是对数,做形容词时是指二重的,二元的.2. Oracle中的dual表是一 ...

  7. redis 之 哨兵

    #:编译安装redis4.0 [root@master ~]# tar xf redis-4.0.14.tar.gz [root@master ~]# cd redis-4.0.14/ [root@m ...

  8. Spring Cloud集成RabbitMQ的使用

    同步 or 异步 前言:我们现在有一个用微服务架构模式开发的系统,系统里有一个商品服务和订单服务,且它们都是同步通信的. 目前我们商品服务和订单服务之间的通信方式是同步的,当业务扩大之后,如果还继续使 ...

  9. Js和Thymeleaf如何获取model中的值

    一.Jquery获取Model中的数据 1.将model中的值赋给hidden,然后Js获取隐藏域的值. 后台的实现: @RequestMapping("/QEditorMod1" ...

  10. 使用fastDFS上传和下载图片文件

    package com.xuecheng.test.fastdfs;import org.csource.common.MyException;import org.csource.fastdfs.* ...