HDU - 1430 魔板 (bfs预处理 + 康托)
对于该题可以直接预处理初始状态[0, 1, 2, 3, 4, 5, 6, 7]所有可以到达的状态,保存到达的路径,直接打印答案即可。
关于此处的状态转换:假设有初始状态为2,3,4,5,0,6,7,1,目标状态为7,1,4,5,2,3,0,6,首先把初态看做0,1,2,3,4,5,6,7,那么目标状态应该看做6,7,2,3,0,1,4,5直接查询到达状态6,7,2,3,0,1,4,5的路径即可。
PS:hdu3567与这题类似。
AC代码:93ms
#include<cstdio> #include<cstring> #include<queue> #include<string> #include<iostream> #include<algorithm> using namespace std; typedef int state[8]; const int maxn = 45000; int vis[maxn]; string path[maxn]; int op[][8] = { 4, 5, 6, 7, 0, 1, 2, 3, 3, 0, 1, 2, 7, 4, 5, 6, 0, 5, 1, 3, 4, 6, 2, 7 }; char dir[] = {'A', 'B', 'C'}; int st[] = {0, 1, 2, 3, 4, 5, 6, 7}; int fact[8]; void deal() { //1~8阶乘打表,方便编码 fact[0] = 1; for(int i = 1; i < 8; ++i) fact[i] = fact[i - 1] * i; } int KT(int *a) { //康托 int code = 0; for(int i = 0; i < 8; ++i) { int cnt = 0; for(int j = i + 1; j < 8; ++j) if(a[j] < a[i]) cnt++; code += fact[7 - i] * cnt; } return code; } struct node{ int a[8]; int code; node(){ } node(int *b, int code):code(code) { memcpy(a, b, sizeof(a)); } }; void walk(int c, int *a) { //对数组进行第c种操作 int b[8]; memcpy(b, a, sizeof(b)); for(int i = 0; i < 8; ++i) { a[i] = b[op[c][i]]; } } void bfs() { //预处理所有可以到达的状态 memset(vis, 0, sizeof(vis)); int code = KT(st); vis[code] = 1; path[code] = ""; queue<node>q; q.push(node(st, code)); while(!q.empty()){ node p = q.front(); q.pop(); int a[8]; for(int i = 0; i < 3; ++i) { //三种操作 memcpy(a, p.a, sizeof(a)); walk(i, a); code = KT(a); if(!vis[code]) { vis[code] = 1; path[code] = path[p.code] + dir[i]; q.push(node(a, code)); } } } } void deal(int *a) { swap(a[4], a[7]); swap(a[5], a[6]); } int main() { deal(); bfs(); int a[8], b[8], ha[8]; char s[20]; while(scanf("%s", s) == 1) { for(int i = 0; i < 8; ++i) { a[i] = s[i] - '0' - 1; } deal(a); for(int i = 0; i < 8; ++i) { ha[a[i]] = i; } scanf("%s", s); for(int i = 0; i < 8; ++i) { b[i] = s[i] - '0' - 1; } deal(b); for(int i = 0; i < 8; ++i) a[i] = ha[b[i]]; int code = KT(a); cout << path[code] << endl; //cout << "HELLO" <<endl; } return 0; }
如有不当之处欢迎指出!
HDU - 1430 魔板 (bfs预处理 + 康托)的更多相关文章
- hdu 1430 魔板 (BFS+预处理)
Problem - 1430 跟八数码相似的一题搜索题.做法可以是双向BFS或者预处理从"12345678"开始可以到达的所有状态,然后等价转换过去直接回溯路径即可. 代码如下: ...
- hdu.1430.魔板(bfs + 康托展开)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- HDU 1430 魔板(康托展开+BFS+预处理)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- [HDU 1430] 魔板
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- HDU - 1430 魔板 【BFS + 康托展开 + 哈希】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1430 思路 我刚开始 想到的 就是 康托展开 但是这个题目是 多组输入 即使用 康托展开 也是会T的 ...
- hdu 1430 魔板 康托展开 + 很好的映射
http://acm.hdu.edu.cn/showproblem.php?pid=1430 如果从start ---> end,每一次都bfs进行,那么就肯定会超时. 考虑到先把start映射 ...
- HDU - 3567 Eight II (bfs预处理 + 康托) [kuangbin带你飞]专题二
类似HDU1430,不过本题需要枚举X的九个位置,分别保存状态,因为要保证最少步数.要保证字典序最小的话,在扩展节点时,方向顺序为:down, left, right, up. 我用c++提交1500 ...
- hdu1430魔板(BFS+康托展开)
做这题先看:http://blog.csdn.net/u010372095/article/details/9904497 Problem Description 在魔方风靡全球之后不久,Rubik先 ...
- HDU 3567 Eight II BFS预处理
题意:就是八数码问题,给你开始的串和结束的串,问你从开始到结束的最短且最小的变换序列是什么 分析:我们可以预处理打表,这里的这个题可以和HDU1430魔板那个题采取一样的做法 预处理打表,因为八数码问 ...
随机推荐
- Servlet--超链接,表单提交,重定向,转发4种情况的路径
实际编码中我们经常写路径,写路径既可以写相对路径,也可以写绝对路径.我2年以前我就养成了习惯,只要是写路径我从来都是写绝对路径,因为万一将来我们的项目的目录发生变化,原来要是写相对路径的话就会有路径依 ...
- BST,AVL,B,B+,B*,红黑树
BST(右)和AVL(左) 比较:AVL树每个结点的左右子树的深度差的绝对值不大于1 B - tree 特点:所有结点都包含数据信息,不同查询的效率不同,特殊的:二阶B树就是AVL,三阶B树就是2-3 ...
- 定时任务schedule(spring boot )
1. 定时任务实现方式:SpringBoot自带的Scheduled,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多,本文主要介绍. 执行方式:单线程(串行)多线程(并行) ...
- 【总目录】——概率论与数理统计及Python实现
注:这是一个横跨数年的任务,标题也可以叫做“从To Do List上划掉学习统计学”.在几年前为p值而苦恼的时候,还不知道Python是什么:后来接触过Python,就喜欢上了这门语言.统计作为数据科 ...
- Python一些方法的用法集锦
1.range()方法: >>>range(5) [0, 1, 2, 3, 4] >>>a= ["heke","sdsdjs" ...
- CGI编程
1简介 .CGI:通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口,服务器和客户端之间的通信,是客户端的浏览器和服务器端的http服务器之间 ...
- centos7添加图像化桌面并设置中文
我前面是使用的centos6.最近才最小化安装了一个centos7.4(最小化安装有很多命令都没有,所以不建议这样干).完了装了图形化界面和设置中文,感觉和centos6有些区别,所以记录一下过程. ...
- squid安装及运行指南
squid安装及运行指南 0. What is squid Squid是一个高性能的代理缓存服务器,Squid支持FTP.gopher.HTTPS和HTTP协议.和一般的代理缓存软件不同,Squid用 ...
- SQL作业二
目的:通过加载chinook_db文件来把数据导入到sqllite,根据题目的要求进行查询 1.sql语句的基本语法 2.join多表查询的用法 3.group by分组的用法 4.order by排 ...
- JAVA常用知识点及面试题总结
1. String.StringBuffer.StringBuilder三者区别? (1)三者在执行速率上的比较: String<StringBuffer<StringBuilder 原因 ...