HDU - 1430 魔板 【BFS + 康托展开 + 哈希】
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1430
思路
我刚开始 想到的 就是 康托展开
但是这个题目是 多组输入 即使用 康托展开 也是会T的
正解应该是 预处理
然后我想到的预处理
因为每个状态 都是能够扩展出三种状态的
也就是说 每个状态都可以有三个儿子 这样 就像一棵树
我先把这棵树 建好 然后 询问的时候 再BFS搜索 这样就不用每次都康托展开了
但是还是T了
后来查了题解
发现 其实每次变换的都是位置,而上面的数字 是什么 其实不重要 我们可以给它哈希成 12345678
比如说 给出的 初始状态是 8 2 7 5 4 6 3 1 目标状态是 1 7 2 4 5 3 6 8
那么 我们可以理解为
8-1
2-2
7-3
5-4
4-5
6-6
3-7
1-8
那么 目标状态 通过哈希 就变为
8 3 2 5 4 7 6 1
问题就转化为
从 1 2 3 4 5 6 7 8 转移到 8 3 2 5 4 7 6 1 需要多少步骤
那么我们就可以 从 1 2 3 4 5 6 7 8 到达任意一种状态都预处理
这样 就可以直接输出路径了。。
我是这样处理的
保存父节点 递归输出
AC代码
#include <cstdio>
#include <cstring>
#include <ctype.h>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <map>
#include <stack>
#include <set>
#include <list>
#include <numeric>
#include <sstream>
#include <iomanip>
#include <limits>
#define CLR(a, b) memset(a, (b), sizeof(a))
#define pb push_back
#define bug puts("***bug***");
#define fi first
#define se second
#define stack_expand #pragma comment(linker, "/STACK:102400000,102400000")
#define syn_close ios::sync_with_stdio(false);cin.tie(0);
//#define bug
//#define gets gets_s
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef pair <string, int> psi;
typedef pair <string, string> pss;
typedef pair <double, int> pdi;
const double PI = acos(-1.0);
const double E = exp(1.0);
const double eps = 1e-8;
const int INF = 0x3f3f3f3f;
const int maxn = 4e4 + 1e3 + 10;
const int MOD = 142857;
const int FAC[] = { 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880 };
int cantor(int b[8])
{
int ans = 0;
for (int i = 0; i < 8; i++)
{
int smaller = 0;
for (int j = i + 1; j < 8; j++)
{
if (b[i] > b[j])
smaller++;
}
ans += FAC[7 - i] * smaller;
}
return ans;
}
int arr[8];
pii pre[maxn];
int visit[maxn];
struct node
{
int arr[8];
int root;
};
void bfs()
{
for (int i = 0; i < maxn; i++)
visit[i] = 0;
int flag;
queue <node> q;
node u;
u.root = 0;
for (int i = 0; i < 8; i++)
u.arr[i] = i + 1;
q.push(u);
visit[0] = 1;
pre[0] = pii(-1, -1);
while (!q.empty())
{
node u = q.front(), vv;
q.pop();
// A
vv.arr[0] = u.arr[7];
vv.arr[1] = u.arr[6];
vv.arr[2] = u.arr[5];
vv.arr[3] = u.arr[4];
vv.arr[4] = u.arr[3];
vv.arr[5] = u.arr[2];
vv.arr[6] = u.arr[1];
vv.arr[7] = u.arr[0];
flag = cantor(vv.arr);
if (visit[flag] == 0)
{
visit[flag] = 1;
vv.root = flag;
pre[flag] = pii(u.root, 1);
q.push(vv);
}
// B
vv.arr[0] = u.arr[3];
vv.arr[1] = u.arr[0];
vv.arr[2] = u.arr[1];
vv.arr[3] = u.arr[2];
vv.arr[4] = u.arr[5];
vv.arr[5] = u.arr[6];
vv.arr[6] = u.arr[7];
vv.arr[7] = u.arr[4];
flag = cantor(vv.arr);
if (visit[flag] == 0)
{
visit[flag] = 1;
vv.root = flag;
pre[flag] = pii(u.root, 2);
q.push(vv);
}
// C
vv.arr[0] = u.arr[0];
vv.arr[1] = u.arr[6];
vv.arr[2] = u.arr[1];
vv.arr[3] = u.arr[3];
vv.arr[4] = u.arr[4];
vv.arr[5] = u.arr[2];
vv.arr[6] = u.arr[5];
vv.arr[7] = u.arr[7];
flag = cantor(vv.arr);
if (visit[flag] == 0)
{
visit[flag] = 1;
vv.root = flag;
pre[flag] = pii(u.root, 3);
q.push(vv);
}
}
}
int ed;
vector <int> ans;
void solve()
{
ans.clear();
while (pre[ed].fi != -1)
{
ans.pb(pre[ed].se);
ed = pre[ed].fi;
}
}
int main()
{
bfs();
string s1, s2;
while (cin >> s1 >> s2)
{
int arr[8];
map <char, int> mp;
for (int i = 0; i < 8; i++)
mp[s1[i]] = i + 1;
for (int i = 0; i < 8; i++)
arr[i] = mp[s2[i]];
ed = cantor(arr);
solve();
int len = ans.size();
for (int i = len - 1; i >= 0; i--)
printf("%c", 'A' + ans[i] - 1);
printf("\n");
}
}
HDU - 1430 魔板 【BFS + 康托展开 + 哈希】的更多相关文章
- 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 ...
- hdu1430魔板(BFS+康托展开)
做这题先看:http://blog.csdn.net/u010372095/article/details/9904497 Problem Description 在魔方风靡全球之后不久,Rubik先 ...
- HDU - 1430 魔板 (bfs预处理 + 康托)
对于该题可以直接预处理初始状态[0, 1, 2, 3, 4, 5, 6, 7]所有可以到达的状态,保存到达的路径,直接打印答案即可. 关于此处的状态转换:假设有初始状态为2,3,4,5,0,6,7,1 ...
- hdu 1430 魔板 (BFS+预处理)
Problem - 1430 跟八数码相似的一题搜索题.做法可以是双向BFS或者预处理从"12345678"开始可以到达的所有状态,然后等价转换过去直接回溯路径即可. 代码如下: ...
- HDU_1430——魔板,预处理,康托展开,置换,string类的+操作
Problem Description 在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板.魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示.任一时刻魔板的状态可 ...
- [HDU 1430] 魔板
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- hdu 1430 魔板 康托展开 + 很好的映射
http://acm.hdu.edu.cn/showproblem.php?pid=1430 如果从start ---> end,每一次都bfs进行,那么就肯定会超时. 考虑到先把start映射 ...
- HDU_1043 Eight 【逆向BFS + 康托展开 】【A* + 康托展开 】
一.题目 http://acm.hdu.edu.cn/showproblem.php?pid=1043 二.两种方法 该题很明显,是一个八数码的问题,就是9宫格,里面有一个空格,外加1~8的数字,任意 ...
随机推荐
- java jdk 环境变量设置
我的电脑点右键,选择“属性”,选择“高级”标签,进入环境变量设置,分别设置如下三个环境变量: 设置JAVA_HOME: 一是为了方便引用,比如,JDK安装在C:\jdk1.6.0目录里,则设置JAVA ...
- centos安装pip Xvfb Selenium
pip安装命令: python -V wget https://bootstrap.pypa.io/get-pip.py python get-pip.py Xvfb安装命令: yum install ...
- Doker容器之间连接
第一个应用容器 $ sudo docker run --name=mysql_client1 --link=mysql_server:db -t -i kongxx/mysql_client /usr ...
- 为什么返回的数据前面有callback? ashx/json.ashx?的后面加 callback=? 起什么作用 js url?callback=xxx xxx的介绍 ajax 跨域请求时url参数添加callback=?会实现跨域问题
为什么返回的数据前面有callback? 这是一个同学出现的问题,问到了我. 应该是这样的: 但问题是这样的: 我看了所请求的格式和后台要求的也是相同的.而且我也是这种做法,为什么他的就不行呢? ...
- zoj 3827 Information Entropy 【水题】
Information Entropy Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge Information ...
- instantclient_11_2 连接oracle数据
(1)首先你要先下载instantclient (解压如下),修改你 instantclient/network/admin/tnsnames.ora 文件,将你oracle的服务器地址写上 ...
- 在jfinal的Controller中接受json数据
JFinal中接收URL中的参数或者model中的参数是很方便的,但是对于web2.0的网站来说,经常会以json方式提交比较复杂的数据,比如一个查询,包含了各种过滤条件和排序分页,前端脚本可能提交的 ...
- 修改Linux字符集
1.查看操作系统中安装的locale信息 ls /usr/lib/locale 2.创建.i18n文件 在用户目录下创建.i18n文件,并添加如下内容: LANG="zh_CN.utf8&q ...
- Hugo hexo 搭建博客系列1:自己的服务器
hexo jekyll https://hexo.io/zh-cn/ http://theme-next.iissnan.com/getting-started.html Hexo 是高效的静态站点生 ...
- Gradle 构建工具
参考文章: 作者:ghui 链接:https://www.zhihu.com/question/30432152/answer/48239946 来源:知乎 著作权归作者所有.商业转载请联系作者获得授 ...