hdu 1430 (BFS 康托展开 或 map )
第一眼看到这题就直接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 #include<stdio.h>
- 2 #include<algorithm>
- 3 #include<iostream>
- 4 #include<string.h>
- 5 #include<stdlib.h>
- 6 #include<math.h>
- 7 #include<queue>
- 8 #include<stack>
- 9 #include<cstdio>
- 10 #include<map>
- 11 void bfs();
- 12 using namespace std;
- 13 void AA(char *p,char *q);
- 14 void BB(char *p,char *q);
- 15 void CC(char *p,char *q);
- 16 int N=50005;
- 17 map<string,int>my;
- 18 char t[10]="12345678";
- 19 char a[41000][100];//总共有8!的状态每个状态对应一个数然后用数组存变换的步奏
- 20 typedef struct pp
- 21 {
- 22
- 23 char ab[10];
- 24 int n;
- 25
- 26 } ss;//开结构体存步数。
- 27 int main(void)
- 28 {
- 29
- 30 int n,i,j,k,p,q;
- 31 char aa[10];
- 32 char bb[10];
- 33 char cc[10];
- 34 bfs();
- 35 while(scanf("%s %s",aa,bb)!=EOF)
- 36 {
- 37 int yu=0;
- 38 for(i=0; i<8; i++)
- 39 {
- 40 for(j=0; j<8; j++)
- 41 {
- 42 if(bb[i]==aa[j])
- 43 {
- 44 cc[yu++]=j+1+'0';
- 45 }
- 46 }
- 47 }
- 48 cc[8]='\0';
- 49 int sh=my[cc];
- 50 puts(a[sh]);
- 51 }
- 52 return 0;
- 53
- 54 }
- 55 void bfs()
- 56 {
- 57 int i,j,k,p,q,l;
- 58 ss ll,mm;
- 59 ll.n=1;
- 60 int v=1;
- 61 my[t]=v;//map标记并映射为一个数
- 62 v++;
- 63 strcpy(ll.ab,t);
- 64 queue<ss>que;
- 65 que.push(ll);
- 66 while(!que.empty())
- 67 {
- 68 mm=que.front();
- 69 que.pop();
- 70 ss pp;
- 71 AA(pp.ab,mm.ab);
- 72
- 73 if(my[pp.ab]==0)
- 74 {
- 75 my[pp.ab]=v;
- 76 strcpy(a[v],a[mm.n]);//接上一个所有的变化步数
- 77 l=strlen(a[v]);//最后加上本次的变换
- 78 a[v][l]='A';
- 79 pp.n=v;
- 80 v++;
- 81 que.push(pp);
- 82 }
- 83 BB(pp.ab,mm.ab);
- 84
- 85 if(my[pp.ab]==0)
- 86 {
- 87 my[pp.ab]=v;
- 88 strcpy(a[v],a[mm.n]);
- 89 l=strlen(a[v]);
- 90 a[v][l]='B';
- 91
- 92 pp.n=v;
- 93 v++;
- 94 que.push(pp);
- 95 }
- 96 CC(pp.ab,mm.ab);
- 97
- 98 if(my[pp.ab]==0)
- 99 {
- 100 my[pp.ab]=v;
- 101 strcpy(a[v],a[mm.n]);
- 102 l=strlen(a[v]);
- 103 a[v][l]='C';
- 104 pp.n=v;
- 105 v++;
- 106 que.push(pp);
- 107 }
- 108
- 109
- 110
- 111
- 112 }
- 113
- 114
- 115
- 116
- 117
- 118
- 119 }//三种不同的转换;
- 120 void AA(char *p,char *q)
- 121 {
- 122 int i,j,k;
- 123 p[0]=q[7];
- 124 p[1]=q[6];
- 125 p[2]=q[5];
- 126 p[3]=q[4];
- 127 p[4]=q[3];
- 128 p[5]=q[2];
- 129 p[6]=q[1];
- 130 p[7]=q[0];
- 131 p[8]='\0';
- 132 }
- 133
- 134 void BB(char *p,char *q)
- 135 {
- 136 int i,j,k;
- 137 p[0]=q[3];
- 138 p[1]=q[0];
- 139 p[2]=q[1];
- 140 p[3]=q[2];
- 141 p[4]=q[5];
- 142 p[5]=q[6];
- 143 p[6]=q[7];
- 144 p[7]=q[4];
- 145 p[8]='\0';
- 146 }
- 147
- 148 void CC(char *p,char *q)
- 149 {
- 150 p[0]=q[0];
- 151 p[1]=q[6];
- 152 p[2]=q[1];
- 153 p[3]=q[3];
- 154 p[4]=q[4];
- 155 p[5]=q[2];
- 156 p[6]=q[5];
- 157 p[7]=q[7];
- 158 p[8]='\0';
- 159 }
- 1 #include<stdio.h>
- 2 #include<algorithm>
- 3 #include<iostream>
- 4 #include<string.h>
- 5 #include<stdlib.h>
- 6 #include<math.h>
- 7 #include<queue>
- 8 #include<stack>
- 9 #include<cstdio>
- 10 int kt(char *p);
- 11 void bfs();
- 12 using namespace std;
- 13 void AA(char *p,char *q);
- 14 void BB(char *p,char *q);
- 15 void CC(char *p,char *q);
- 16 int as[10];
- 17 int N=50005;
- 18 bool vis[50005];
- 19 char t[10]="12345678";
- 20 char a[41000][100];
- 21 typedef struct pp
- 22 {
- 23 char ab[10];
- 24 int n;
- 25
- 26 } ss;
- 27 int main(void)
- 28 {
- 29 as[0]=1;
- 30 as[1]=1;
- 31 as[2]=2;
- 32 as[3]=6;
- 33 as[4]=24;
- 34 as[5]=120;
- 35 as[6]=720;
- 36 as[7]=5040;//康托展开预处理
- 37 int n,i,j,k,p,q;
- 38 char aa[10];
- 39 char bb[10];
- 40 char cc[10];
- 41 memset(vis,0,sizeof(vis));
- 42 bfs();
- 43 while(scanf("%s %s",aa,bb)!=EOF)
- 44 {
- 45 int yu=0;
- 46 for(i=0; i<8; i++)
- 47 {
- 48 for(j=0; j<8; j++)
- 49 {
- 50 if(bb[i]==aa[j])
- 51 {
- 52 cc[yu++]=j+1+'0';
- 53 }
- 54 }
- 55 }
- 56
- 57 int sh=kt(cc);
- 58
- 59 puts(a[sh]);
- 60 }
- 61
- 62 return 0;
- 63
- 64 }
- 65
- 66 int kt(char *p)//康托展开
- 67 {
- 68 int i,j;
- 69 int kk=0;
- 70 for(i=0; i<8; i++)
- 71 {
- 72 int yy=0;
- 73 for(j=i+1; j<8; j++)
- 74 {
- 75 if((p[i]-'0')>(p[j]-'0'))
- 76 {
- 77 yy++;
- 78 }
- 79 }
- 80 kk+=yy*as[7-i];
- 81
- 82
- 83 }
- 84 return kk;
- 85 }
- 86
- 87 void bfs()
- 88 {
- 89 int i,j,k,p,q,l;
- 90 ss ll,mm;
- 91 ll.n=0;
- 92 vis[0]=true;
- 93 strcpy(ll.ab,t);
- 94 queue<ss>que;
- 95 que.push(ll);
- 96 while(!que.empty())
- 97 {
- 98 mm=que.front();
- 99 que.pop();
- 100 ss pp;
- 101 AA(pp.ab,mm.ab);
- 102 int yy=kt(pp.ab);
- 103 if(!vis[yy])
- 104 {
- 105 vis[yy]=true;
- 106 strcpy(a[yy],a[mm.n]);
- 107 l=strlen(a[yy]);
- 108 a[yy][l]='A';
- 109 pp.n=yy;
- 110 que.push(pp);
- 111 }
- 112 BB(pp.ab,mm.ab);
- 113 yy=kt(pp.ab);
- 114 if(!vis[yy])
- 115 {
- 116 vis[yy]=true;
- 117 strcpy(a[yy],a[mm.n]);
- 118 l=strlen(a[yy]);
- 119 a[yy][l]='B';
- 120 pp.n=yy;
- 121 que.push(pp);
- 122 }
- 123 CC(pp.ab,mm.ab);
- 124 yy=kt(pp.ab);
- 125 if(!vis[yy])
- 126 {
- 127 vis[yy]=true;
- 128 strcpy(a[yy],a[mm.n]);
- 129 l=strlen(a[yy]);
- 130 a[yy][l]='C';
- 131 pp.n=yy;
- 132 que.push(pp);
- 133 }
- 134
- 135
- 136
- 137
- 138 }
- 139
- 140
- 141
- 142
- 143
- 144 }
- 145 void AA(char *p,char *q)
- 146 {
- 147 int i,j,k;
- 148 p[0]=q[7];
- 149 p[1]=q[6];
- 150 p[2]=q[5];
- 151 p[3]=q[4];
- 152 p[4]=q[3];
- 153 p[5]=q[2];
- 154 p[6]=q[1];
- 155 p[7]=q[0];
- 156 }
- 157
- 158 void BB(char *p,char *q)
- 159 {
- 160 int i,j,k;
- 161 p[0]=q[3];
- 162 p[1]=q[0];
- 163 p[2]=q[1];
- 164 p[3]=q[2];
- 165 p[4]=q[5];
- 166 p[5]=q[6];
- 167 p[6]=q[7];
- 168 p[7]=q[4];
- 169 }
- 170
- 171 void CC(char *p,char *q)
- 172 {
- 173 p[0]=q[0];
- 174 p[1]=q[6];
- 175 p[2]=q[1];
- 176 p[3]=q[3];
- 177 p[4]=q[4];
- 178 p[5]=q[2];
- 179 p[6]=q[5];
- 180 p[7]=q[7];
- 181 }
hdu 1430 (BFS 康托展开 或 map )的更多相关文章
- hdu 1430(BFS+康托展开+映射+输出路径)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- hdu 5012 bfs 康托展开
Dice Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submi ...
- HDU_1043 Eight 【逆向BFS + 康托展开 】【A* + 康托展开 】
一.题目 http://acm.hdu.edu.cn/showproblem.php?pid=1043 二.两种方法 该题很明显,是一个八数码的问题,就是9宫格,里面有一个空格,外加1~8的数字,任意 ...
- HDU - 1430 魔板 【BFS + 康托展开 + 哈希】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1430 思路 我刚开始 想到的 就是 康托展开 但是这个题目是 多组输入 即使用 康托展开 也是会T的 ...
- hdu.1430.魔板(bfs + 康托展开)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- HDU 1043 Eight(双向BFS+康托展开)
http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...
- 【HDU - 1043】Eight(反向bfs+康托展开)
Eight Descriptions: 简单介绍一下八数码问题:在一个3×3的九宫格上,填有1~8八个数字,空余一个位置,例如下图: 1 2 3 4 5 6 7 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]*( ...
- POJ 1077 Eight (BFS+康托展开)详解
本题知识点和基本代码来自<算法竞赛 入门到进阶>(作者:罗勇军 郭卫斌) 如有问题欢迎巨巨们提出 题意:八数码问题是在一个3*3的棋盘上放置编号为1~8的方块,其中有一块为控制,与空格相邻 ...
随机推荐
- MongoDB的搭建、参数
Mongodb官网:https://www.mongodb.com/ mkdir -r /data/db touch /data/log tar -zxvf mongodb-linux-x86_6 ...
- 12-gauge/bore shotgun
12-gauge/bore shotgun不是弹夹(magazine)容量为12发的霰(xian)弹枪.[LDOCE]gauge - a measurement of the width or thi ...
- pyqt5 的串口编写进度
2020.12.18 今天遇到一个问题, 想用回车实现串口数据的发送. 下面这句话是让光标移动到文字的尾部,但是不能够实现. 对QTextEdit控件中的文字改写,或清除后,再调用下面的移动到尾部,就 ...
- 容器之分类与各种测试(四)——map
map和set的区别在于,前者key和value是分开的,前者的key不会重复,value可以重复:后者的key即为value,后者的value不允许重复.还有,map在插入时可以使用 [ ]进行(看 ...
- Oracle异常处理——ORA-01502:索引或这类索引的分区处于不可用状态
Oracle异常处理--ORA-01502:索引或这类索引的分区处于不可用状态参考自:https://www.cnblogs.com/lijiaman/p/9277149.html 1.原因分析经过查 ...
- ORACLE中dual用法详解
基本上oracle引入dual为的就是符合语法1. 我们先从名称来说,dual不是缩写词,本身就是完整的单词.dual名词意思是对数,做形容词时是指二重的,二元的.2. Oracle中的dual表是一 ...
- redis 之 哨兵
#:编译安装redis4.0 [root@master ~]# tar xf redis-4.0.14.tar.gz [root@master ~]# cd redis-4.0.14/ [root@m ...
- Spring Cloud集成RabbitMQ的使用
同步 or 异步 前言:我们现在有一个用微服务架构模式开发的系统,系统里有一个商品服务和订单服务,且它们都是同步通信的. 目前我们商品服务和订单服务之间的通信方式是同步的,当业务扩大之后,如果还继续使 ...
- Js和Thymeleaf如何获取model中的值
一.Jquery获取Model中的数据 1.将model中的值赋给hidden,然后Js获取隐藏域的值. 后台的实现: @RequestMapping("/QEditorMod1" ...
- 使用fastDFS上传和下载图片文件
package com.xuecheng.test.fastdfs;import org.csource.common.MyException;import org.csource.fastdfs.* ...