给定三种操作,将排列A转化为排列B,求最少步骤。

这种题目可以只跑一次bfs,比如只跑"12345678",那么如果遇到"23456781"->某个字符串呢?因为每一个数字都是等价的,我们可以把2映射为1,3映射成2,以此类推。这样就可以用"12345678"跑出来的操作序列了。

#include <iostream>
#include <iomanip>
#include <set>
#include <cmath>
#include <string>
#include <algorithm>
#include <queue>
#include <vector>
#include <map>
#define LL long long
using namespace std;
class cantor
{
public:
#define siz 8
char c[siz]= {'','','','','','','',''};
LL w[siz];
bool vis[siz];
cantor()
{
w[]=;
for(int i=; i<siz; i++)
w[i]=w[i-]*i;
}
void init()
{
for(int i=; i<siz; i++)
vis[i]=false;
}
LL makeCanto(string s)
{
init();
LL rec=;
for(int i=; i<siz; i++)
{
int d=;
for(int j=; j<siz; j++)
{
if(vis[j])
continue;
if(c[j]!=s[i])d++;
else
{
vis[j]=true;
break;
}
}
rec+=w[siz-i-]*d;
}
return rec;
}
string recover(LL val)
{
init();
string s="";
for(int i=siz-; i>=; i--)
{
LL te=val/w[i];
val%=w[i];
for(int j=,cnt=-; j<siz; j++)
{
if(vis[j])continue;
else cnt++;
if(cnt==te&&!vis[j])
{
s+=c[j];
vis[j]=true;
break;
}
}
}
return s;
}
} fix;
struct ax
{
int _1,_2;
ax(int __1,int __2)
{
_1=__1;
_2=__2;
}
friend bool operator < (ax a,ax b)
{
if(a._1==b._1)
return a._2<b._2;
return a._1<b._2;
}
};
LL n,m;
bool vis[];
bool f;
struct node
{
LL v;
string a;
node(LL V,string A)
{
v=V;
a=A;
}
};
map<int,string> ans;
void bfs(int fr)
{
queue<node> q;
node ini=node(fr,"");
q.push(ini);
fill(vis,vis+,false);
vis[fr]=true;
while(!q.empty())
{
node now=q.front();
q.pop();
ans[now.v]=now.a;
string nows=fix.recover(now.v);
string nx;
//A
nx=nows;
for(int i=; i<; i++)
swap(nx[i],nx[i+]);
if(!vis[fix.makeCanto(nx)])
vis[fix.makeCanto(nx)]=true,q.push(node(fix.makeCanto(nx),now.a+"A"));
//B
for(int i=; i<; i++)
nx[(i+)%]=nows[i],nx[+(i+)%]=nows[+i];
if(!vis[fix.makeCanto(nx)])
vis[fix.makeCanto(nx)]=true,q.push(node(fix.makeCanto(nx),now.a+"B"));
//C
nx=nows;
nx[]=nows[];nx[]=nows[];
nx[]=nows[];nx[]=nows[];
if(!vis[fix.makeCanto(nx)])
vis[fix.makeCanto(nx)]=true,q.push(node(fix.makeCanto(nx),now.a+"C"));
}
}
int main()
{
cin.sync_with_stdio(false); string s1,s2;
/*
string nows,nx;
cin>>nows; nx=nows;
nx[1]=nows[5];nx[2]=nows[1];
nx[6]=nows[2];nx[5]=nows[6];
nows=nx;
nx[1]=nows[5];nx[2]=nows[1];
nx[6]=nows[2];nx[5]=nows[6];
cout<<nx<<endl;
*/
string fuck="";
bfs(fix.makeCanto(fuck));
while(cin>>s1>>s2)
{
reverse(s1.begin()+,s1.end());
reverse(s2.begin()+,s2.end());
for(int i=;i<;i++)
{
int d;
for(int j=;j<;j++)
if(s2[i]==s1[j])
d=j;
s2[i]=fuck[d];
}
cout<<ans[fix.makeCanto(s2)]<<endl; }
}

hdu-1430 魔板 康拓展开+映射优化的更多相关文章

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

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

  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 魔板 (BFS+预处理)

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

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

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

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

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

  9. hdu1430 魔板(康拓展开 bfs预处理)

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

随机推荐

  1. 使用iostat查看磁盘使用情况

    Ⅰ.iostat安装 [root@VM_42_63_centos ~]# yum install -y sysstat Ⅱ.玩一手 [root@VM_42_63_centos ~]# iostat - ...

  2. Web开发——HTML基础(HTML响应式Web设计 Bootstrap)

    参考: 参考:http://www.bootcss.com/ 目录: 1.什么是响应式 Web 设计? 2.创建自己的响应设计 3.使用 Bootstrap 1.什么是响应式 Web 设计? RWD ...

  3. C0气体传感器分析

    1.外观.价格 2.工作原理 MQ-7 CO气体传感器使用的敏感元件为气敏材料(SnO2),该传感器对一氧化碳的灵敏度高. SnO2在洁净空气中电导率低,传感器的电导率随着空气中CO气体浓度增加而增大 ...

  4. 网络对抗实验一 逆向及Bof基础实践

    网络对抗实验一 逆向及Bof基础实践 一.实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. ...

  5. 原生ajax函数封装

    原生ajax函数 function ajax(json){ json=json || {}; if(!json.url){ return; } json.data=json.data || {}; j ...

  6. jquery实现一个标签图标hover到上面的时候显示tooltip

    设计图: 解决思路:1.在thumbnailbox.js这个插件中加入tags弹出框显示的内容,一开始让这些内容display:none; 然后再用css画出来一个三角形 实现方法: 知识点:Jque ...

  7. JMeter-充值-生成随机数

    1.随机数,orderId每次需要变化,需要用到随机数 验证生成的随机数:

  8. cocos2d-x 编译 安卓(android)apk文件

    摘要: 一.下载Android环境 搭建Android环境需要用到Android SDK.NDK.Ant和JDK: 下载Android SDK  下载Android NDk  下载Android JD ...

  9. Linux 配置SSH 无密钥登陆

    根据SSH 协议,每次登陆必须输入密码,比较麻烦,SSH还提供了公钥登陆,可以省去输入密码的步骤. 公钥登陆:用户将自己的公钥存储在远程主机上,登陆的时候,远程主机会向用户发送一串随机字符串,用户用自 ...

  10. Kubernetes容器上下文环境

    目录贴:Kubernetes学习系列 下面我们将主要介绍运行在Kubernetes集群中的容器所能够感知到的上下文环境,以及容器是如何获知这些信息的. 首先,Kubernetes提供了一个能够让容器感 ...