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魔板那个题采取一样的做法 预处理打表,因为八数码问 ...
随机推荐
- junit参数化测试
在前面的junit4初体验中我就说过,junit参数化测试是一只小怪兽,只逼编码痛点,现在我们这里来整理一下. 看过我前面的那篇初体验的就会发现一个问题,我们的测试代码大量的重复了.在这里先贴出原来的 ...
- SQL查询语句优化的实用方法
查询语句的优化是SQL效率优化的一个方式,可以通过优化sql语句来尽量使用已有的索引,避免全表扫描,从而提高查询效率.最近在对项目中的一些sql进行优化,总结整理了一些方法. 1.在表中建立索引,优先 ...
- <global-results>标签来定义全局的<result>
<global-results> <result name="error">/Error.jsp</result> <!-- Ac ...
- 常用Nagios配置命令
cd /usr/local/nagios/etc vim nagios.cfg /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios ...
- mysql数据库在windows下安装与配置
mysql是一种开源源代码的关系型数据库系统(RDBMS),使用最常用的数据库管理语言--结构化查询语句(SQL)进行数据库管理. MySQL是开放源代码的,因此任何人都可以在General Pu ...
- PHPSTUDY下升级mysql后无法启动
说来也是搞笑,之前很早就想看Laravel了~其中,之前项目忙,还有就是自己也出了点事故!但是呢,我个人哭过,抱怨过,但是我还是很懂我自己的.也许没心没肺也是一种好事,但也是坏事~ 闲话说多了,来说正 ...
- Spring Boot快速入门(最新)
本章通过完成Spring Boot基础项目的构建并实现一个简单的Http请求处理,让大家对Spring Boot有一个初步的了解,并体验其结构简单.开发快速的特性.预计阅读及演练过程将花费约5分钟. ...
- 如何实现Selenium自动化读取H5手机缓存
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6890675.html 前言: 由于Se ...
- CheckStyle
在Eclipse当中安装CheckStyle插件非常方便,和安装FindBugs除了URL有区别之外,其他的几乎完全一样.我们可以参照以下几个步骤进行(注意一下,eclipse版本不一样,可能安装插件 ...
- 洛谷 [P1280] 尼克的任务
DP 题目问的是最大空暇时间,那么就定义dp[i]为第i分钟的最大空暇时间,显然满足最优子结构,我们发现dp[i]仅与其后的值有关,那么从后往前推,如果第i分钟没有任务,dp[i]=dp[i+1],如 ...