对于该题可以直接预处理初始状态[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预处理 + 康托)的更多相关文章

  1. hdu 1430 魔板 (BFS+预处理)

    Problem - 1430 跟八数码相似的一题搜索题.做法可以是双向BFS或者预处理从"12345678"开始可以到达的所有状态,然后等价转换过去直接回溯路径即可. 代码如下: ...

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

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

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

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

  4. [HDU 1430] 魔板

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

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

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

  6. hdu 1430 魔板 康托展开 + 很好的映射

    http://acm.hdu.edu.cn/showproblem.php?pid=1430 如果从start ---> end,每一次都bfs进行,那么就肯定会超时. 考虑到先把start映射 ...

  7. HDU - 3567 Eight II (bfs预处理 + 康托) [kuangbin带你飞]专题二

    类似HDU1430,不过本题需要枚举X的九个位置,分别保存状态,因为要保证最少步数.要保证字典序最小的话,在扩展节点时,方向顺序为:down, left, right, up. 我用c++提交1500 ...

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

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

  9. HDU 3567 Eight II BFS预处理

    题意:就是八数码问题,给你开始的串和结束的串,问你从开始到结束的最短且最小的变换序列是什么 分析:我们可以预处理打表,这里的这个题可以和HDU1430魔板那个题采取一样的做法 预处理打表,因为八数码问 ...

随机推荐

  1. oracle用户与表空间操作

    oracle系统用户sys,system , sysman, scott 使用system用户登录[username/password][@server][as sysdba|sysoper]eg: ...

  2. linux tar 压缩解压命令

    tar命令: -c 压缩-x 解压缩-t 不解压的情况下查看文件内容-r 向压缩文件追加文件-u 更新压缩文件 以上参数必须和'-f'参数连用,且'-f'必须为最后一个参数,后接文档名 -z 对应gz ...

  3. python绘制图形(Turtle模块)

    用python的Turtle模块可以绘制很多精美的图形,下面简单介绍一下使用方法. 需要用到的工具有python,python 的安装这里就不再细说.自行搜索. from turtle import ...

  4. 高通HAL层之Sensor HAL

    高通的HAL层其实分为两种,一种是直接从kernel这边报数据上来的,由sensor HAL层来监听,另一种是走ADSP的模式,HAL层是通过qmi的形式进行监听的: 走ADSP架构的可以看下面的博客 ...

  5. SpringMVC源码情操陶冶-ResourcesBeanDefinitionParser静态资源解析器

    解析mvc:resources节点,控制对静态资源的映射访问 查看官方注释 /** * {@link org.springframework.beans.factory.xml.BeanDefinit ...

  6. (转)Elasticsearch 5 Ik+pinyin分词配置详解

    今天以这篇文章结束同城旅游网的面试,正好面试官也问到站内检索,可以尝试一下这篇文章介绍的方法.Elasticsearch 5 Ik+pinyin分词配置详解

  7. bzoj 4825: [Hnoi2017]单旋 [lct]

    4825: [Hnoi2017]单旋 题意:有趣的spaly hnoi2017刚出来我就去做,当时这题作死用了ett,调了5节课没做出来然后发现好像直接用lct就行了然后弃掉了... md用lct不知 ...

  8. CF698C. LRU [容斥原理 概率]

    CF698C. LRU 题意:n种物品,大小为k的队列,\(p_i\)的概率选择第i种物品放入队尾,如果已经有i了就不放了.队列大小>k时弹出队首.求\(10^{100}\)次操作后每种物品在队 ...

  9. BZOJ 2024: [SHOI2009] 舞会 [容斥原理 高精度]

    题意:和上题基本一样,求至少k对a>b的方案数.不取模!!! 做k+1遍容斥就行了 高精度超强!!!几乎把所有的都用上了 然后,注意有负数,所以容斥的时候正负分别保存然后再一减就行了 这是我省选 ...

  10. SPOJ 7258 Lexicographical Substring Search [后缀自动机 DP]

    题意:给一个长度不超过90000的串S,每次询问它的所有不同子串中,字典序第K小的,询问不超过500个. 第一道自己做的1A的SAM啦啦啦 很简单,建SAM后跑kth就行了 也需要按val基数排序倒着 ...