HDU1430;魔板(BFS+康托展开)
传送门
题意
给出初始序列与终止序列,给出三种操作,问最少经过几次操作能使初始->终止,输出操作(字典序最小)
分析
字符串只有8个字符,使用康托展开。
1.BFS将所有序列从"12345678"操作得到,能够保证字典序与次数最小(采用string)
2.接下来将初始序列变成"12345678",相应终止序列也变化,该操作由下列代码实现
R(i,0,8) pos[s1[i]-'0']=i+1;
R(i,0,8) s2[i]=pos[s2[i]-'0'];
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define F(i,a,b) for(int i=a;i<=b;++i)
#define R(i,a,b) for(int i=a;i<b;++i)
#define mem(a,b) memset(a,b,sizeof(a))
#define cpy(a,b) memcpy(a,b,sizeof(b))
string s1,s2,ans[100100];
int a[10]={1,1,2,6,24,120,720,5040},pos[10];
bool vis[100100];
int cal(string &s)//cnt=a[i]*(n-i-1)!
{
int ret=0;
R(i,0,7)
{
int tmp=0;
R(j,i+1,8) if(s[i]>s[j]) tmp++;
ret+=tmp*a[7-i];
}
//printf("ret=%d\n",ret);
return ret;
}
struct node
{
string s;
int value;
};
void op1(string &s)
{
F(i,1,4) swap(s[i-1],s[8-i]);
}
void op2(string &s)
{
for(int i=3;i;--i) swap(s[i],s[i-1]);
for(int i=4;i<7;++i) swap(s[i],s[i+1]);
}
void op3(string &s)
{
swap(s[1],s[6]);swap(s[6],s[5]);swap(s[2],s[5]);
}
queue<node>q;
void bfs()
{
string s="12345678";
node p;
p.s=s;
p.value=cal(s);
vis[p.value]=1;
ans[p.value]="";
q.push(p);
while(!q.empty())
{
//puts("1");
p=q.front();q.pop();
//if(vis[p.value]) continue;
F(i,1,3)
{
if(i==1)
{
node pp=p;
op1(pp.s);
pp.value=cal(pp.s);
if(!vis[pp.value])
{
vis[pp.value]=1;ans[pp.value]=ans[p.value]+'A';
q.push(pp);
}
}
if(i==2)
{
node pp=p;
op2(pp.s);
pp.value=cal(pp.s);
if(!vis[pp.value])
{
vis[pp.value]=1;ans[pp.value]=ans[p.value]+'B';
q.push(pp);
}
}
if(i==3)
{
node pp=p;
op3(pp.s);
pp.value=cal(pp.s);
if(!vis[pp.value])
{
vis[pp.value]=1;ans[pp.value]=ans[p.value]+'C';
q.push(pp);
}
}
}
}
}
int main()
{
bfs();
while(cin>>s1>>s2)
{
R(i,0,8) pos[s1[i]-'0']=i+1;
R(i,0,8) s2[i]=pos[s2[i]-'0'];
cout<<ans[cal(s2)]<<endl;
}
return 0;
}
HDU1430;魔板(BFS+康托展开)的更多相关文章
- hdu1430魔板(BFS+康托展开)
做这题先看:http://blog.csdn.net/u010372095/article/details/9904497 Problem Description 在魔方风靡全球之后不久,Rubik先 ...
- 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预处理)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- HDU_1430——魔板,预处理,康托展开,置换,string类的+操作
Problem Description 在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板.魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示.任一时刻魔板的状态可 ...
- HDU_1043 Eight 【逆向BFS + 康托展开 】【A* + 康托展开 】
一.题目 http://acm.hdu.edu.cn/showproblem.php?pid=1043 二.两种方法 该题很明显,是一个八数码的问题,就是9宫格,里面有一个空格,外加1~8的数字,任意 ...
- 魔板 (bfs+康托展开)
# 10027. 「一本通 1.4 例 2」魔板 [题目描述] Rubik 先生在发明了风靡全球魔方之后,又发明了它的二维版本--魔板.这是一张有 888 个大小相同的格子的魔板: 1 2 3 4 8 ...
- HDU_1430 魔板 【BFS+康托展开+置换】
一.题面 POJ1430 二.分析 该题与之前做的八数码不同,它是一个2*4的棋盘,并且没有空的区域.这样考虑的情况是很少的,依然结合康托展开,这时康托展开最多也只乘7的阶乘,完全可以BFS先预处理一 ...
- HDU - 1430 魔板 【BFS + 康托展开 + 哈希】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1430 思路 我刚开始 想到的 就是 康托展开 但是这个题目是 多组输入 即使用 康托展开 也是会T的 ...
随机推荐
- PHP的资源类型
PHP的资源类型 php的资源类型 常见的有:打开文件.数据库连接.图形画布等. 常用操作:创建.使用.释放. 以文件操作为示例: //文件路径 $file_url = './data.txt'; / ...
- windows下的asp.net core开发及docker下的发布
参照下面,搭建好开发环境.Docker及配置好Docker加速器 http://www.cnblogs.com/windchen/p/6257846.html 参照下面,将windows共享目录挂载到 ...
- python学习之 - re模块
re模块功能:实现字符串匹配. 元字符 描述\ 将下一个字符标记符.或一个向后引用.或一个八进制转义符.例如,“\\n”匹配\n.“\n”匹配换行符.序列“\\”匹配“\”而“\(”则匹配“(”.即相 ...
- 时间戳转换成DateTime
select DateAdd(hour,8,Dateadd(ss,时间戳,'1970-01-01')) --1970/01/01+时间戳(秒数)+8小时 --因GMT是中央时区,北京在东8区,相差 ...
- Django的form,model自定制
一.Form组件原理: django框架提供了一个form类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此django的forms类提供了全面的内容验证 ...
- poj 3041——Asteroids
poj 3041——Asteroids Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22604 Accep ...
- 2017多校Round5(hdu6085~hdu6095)
补题进度:7/11 1001(模意义下的卷积) 题意: 给出长度<=50000的两个数组A[] B[],保证数组中的值<=50000且A[]中数字两两不同,B[]中数字两两不同 有5000 ...
- centOS 安装mysql5.6
删除原先的mysql5.1#数据库服务器的安装 , 请自行在mysql官方找最新的rpm rpm -Uvh http://dev.mysql.com/get/mysql-community-relea ...
- javascript创建对象总结(javascript高级程序设计)
1.工厂模式 这样的模式抽象创建详细对象的过程.用函数封装特定的接口来创建类. function createStudent(name) { var o = new Object(); o.name ...
- js 终止执行的实现方法
终止JS运行有如下几种可能: 1.终止函数的运行的方式有两种 (1)在函数中使用return,则当遇到return时,函数终止执行,控制权继续向下运行 (2)在函数中使用try-catch异常处理,需 ...