http://acm.hdu.edu.cn/showproblem.php?pid=1430

如果从start ---> end,每一次都bfs进行,那么就肯定会超时。

考虑到先把start映射到原始状态"12345678",然后又把end按照同样的规则,就是start的变化,映射到某一个地方。那么就可以看作是从固定的起点“12345678”-->newend,这个就可以打表了。

比如从87654321变化到12345678,那么就是8变成了1,7变成了2,6变成了3....。。那么end那里也按照这样变,在end中找一个8,变成1......以此类推。

相当于模仿start走动而已,肯定能走到的。

然后就可以打表。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <bitset> class cantor { //求1...n的排列的第k大 && hash排列,
public : ///class默认是private,所以要加上public
int fac[];
cantor() { //预处理阶乘
fac[] = ;
for (int i = ; i <= ; ++i) {
fac[i] = fac[i - ] * i;
}
}
int decode(char str[], int lenstr) { //O(n * n)的hash
int ans = ;
for (int i = ; i < lenstr; ++i) {
int cnt = ;
for (int j = i + ; j <= lenstr; ++j) {
if (str[i] > str[j]) {
cnt++;
}
}
ans += cnt * fac[lenstr - i];
}
return ans + ;
}
vector<int> encode(int lenstr, int k) { //字典序排第k的是那个,k从1开始
vector<int>ans;
int toans;
bool vis[] = {};
for (int i = ; i <= lenstr; ++i) {
int t = k / fac[lenstr - i];
k %= fac[lenstr - i];
for (toans = ; toans <= lenstr; ++toans) {
if (vis[toans]) continue;
if (t == ) break;
t--;
}
ans.push_back(toans);
vis[toans] = true;
}
return ans;
}
} cantor;
char be[], en[];
void A(char str[]) {
for (int i = ; i <= ; ++i) {
swap(str[i], str[ - i]);
}
}
void B(char str[]) {
char t = str[];
for (int i = ; i >= ; --i) str[i] = str[i - ];
str[] = t;
t = str[];
for (int i = ; i < ; ++i) str[i] = str[i + ];
str[] = t;
}
void C(char str[]) {
char t1 = str[];
str[] = str[];
char t2 = str[];
str[] = t1;
t1 = str[];
str[] = t2;
str[] = t1;
}
struct node {
char str[];
string now;
node(char ss[]) {
strcpy(str + , ss + );
}
node() {}
} que[ + ];
bool vis[ + ];
string ans[ + ];
void bfs() {
char st[] = "q12345678";
int fr, tail;
fr = tail = ;
que[tail++] = node(st);
que[fr].now = "";
vis[cantor.decode(st, )] = true;
while (fr < tail) {
char t[];
strcpy(t + , que[fr].str + );
A(t);
int valt = cantor.decode(t, );
if (vis[valt] == false) {
vis[valt] = true;
strcpy(que[tail].str + , t + );
que[tail].now = que[fr].now + "A";
ans[valt] = que[tail].now;
tail++;
} strcpy(t + , que[fr].str + );
B(t);
valt = cantor.decode(t, );
if (vis[valt] == false) {
vis[valt] = true;
strcpy(que[tail].str + , t + );
que[tail].now = que[fr].now + "B";
ans[valt] = que[tail].now;
tail++;
} strcpy(t + , que[fr].str + );
C(t);
valt = cantor.decode(t, );
if (vis[valt] == false) {
vis[valt] = true;
strcpy(que[tail].str + , t + );
que[tail].now = que[fr].now + "C";
ans[valt] = que[tail].now;
tail++;
}
fr++;
}
}
int pos[], f[];
char ten[];
void work() {
for (int i = ; i <= ; ++i) {
pos[be[i] - ''] = i;
}
for (int i = ; i <= ; ++i) {
en[i] = pos[en[i] - ''] + '';
}
// cout << en + 1 << endl;
cout << ans[cantor.decode(en, )] << endl;
}
int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
// cout << cantor.decode("q87645321", 8) << endl;
bfs();
while (scanf("%s%s", be + , en + ) != EOF) work();
return ;
}

hdu 1430 魔板 康托展开 + 很好的映射的更多相关文章

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

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

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

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

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

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

  4. [HDU 1430] 魔板

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

  5. HDU - 1430 魔板 (bfs预处理 + 康托)

    对于该题可以直接预处理初始状态[0, 1, 2, 3, 4, 5, 6, 7]所有可以到达的状态,保存到达的路径,直接打印答案即可. 关于此处的状态转换:假设有初始状态为2,3,4,5,0,6,7,1 ...

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

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

  7. hdu-1430 魔板 康拓展开+映射优化

    给定三种操作,将排列A转化为排列B,求最少步骤. 这种题目可以只跑一次bfs,比如只跑"12345678",那么如果遇到"23456781"->某个字符串 ...

  8. hdu 1430(BFS+康托展开+映射+输出路径)

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

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

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

随机推荐

  1. long类型字段转换成varchar2类型

    參考文档: How to Convert a Long to Varchar2 (文档 ID 228532.1) /*long类型字段转换成varchar2类型*/ --建表 create table ...

  2. 在调试C++程序是出现这个问题的解决方案illegal pure syntax, must be '= 0'

    笔者在调试c++的时候遇见了这个问题 E:\Data Struct\SqString\新建 文本文档.cpp(5) : error C2258: illegal pure syntax, must b ...

  3. Android 官方博客 - Android应用程序的内存分析(翻译)(转)

    转自:http://www.cnblogs.com/wisekingokok/archive/2011/11/30/2245790.html Dalvik虚拟机支持垃圾收集,但是这不意味着你可以不用关 ...

  4. Python爬虫开发【第1篇】【多线程爬虫及案例】

    糗事百科爬虫实例: 地址:http://www.qiushibaike.com/8hr/page/1 需求: 使用requests获取页面信息,用XPath / re 做数据提取 获取每个帖子里的用户 ...

  5. Unity即将到来的2D工具

    孙广东  2015.7.5 看了一下对功能介绍的视频,确实功能强大. 可是须要FQ在youtube上观看,所以就下载下来了.能够浏览一下: http://www.iqiyi.com/playlist2 ...

  6. Koa2学习(四)POST请求

    Koa2学习(四)POST请求 接受请求 POST请求的数据实体,会根据数据量的大小进行分包传送. 当node.js后台收到post请求时,会以buffer的形式将数据缓存起来.Koa2中通过ctx. ...

  7. beego6

    package main //beego使用的是go语言原生的模版 import ( //_ "beego1/routers" //默认controll文件夹里面的控制器 &quo ...

  8. Java内部类用法

    内部类可以是静态(static)的,可以使用 public.protected 和 private 访问控制符,而外部类只能使用 public,或者默认. 成员式内部类 在外部类内部直接定义(不在方法 ...

  9. Ubuntu 12.10终端Terminal快捷方式调用

    1:使用快捷键:ctrl+alt+t 打开终端 2:在终端上右键,选“Lock to launcher” 这样就锁定在左侧了,需要用时,直接点就打开了.

  10. spark安装和登陆配置

    1.下载安装包: http://www.igniterealtime.org/downloads/index.jsp 2.点击安装后打开登陆界面: 2.点击“高级”,设置相关配置: 3.点击“登陆”后 ...