ACM/ICPC 之 BFS(离线)+康拓展开 (HDU1430-魔板)
魔板问题,一道经典的康拓展开+BFS问题,为了实现方便,我用string类来表示字符串,此前很少用string类(因为不够高效,而且相对来说我对char数组的相关函数比较熟),所以在这里也发现了很多容易被忽视的问题。
对于康拓展开不太熟系的可以先参看一篇博客:http://blog.csdn.net/zhongkeli/article/details/6966805
关于sting类,大家要注意,在赋值的时候,其赋值位置不能与首位置间存在未赋值部分。
题目需要转换思路的地方是: 我们需要将起始魔板->目标魔板 转换为 标准魔板->新目标魔板的形式,以便离线(打表)一次就够了。
具体代码如下:
//魔板问题-BFS(离线)+康拓展开
//Time: 38Ms Memory:6484K
#include<iostream>
#include<string>
#include<queue>
#include<algorithm>
using namespace std; #define MAX 40321 int fac[] = { ,,,,,,, }; //阶乘数组 int v[MAX]; //访问标记
string ans[MAX]; //离线表 struct Board{
int val; //Hash值
string str;
}; //康拓展开(Hash)
int Contor(string str)
{
int num = ; //Hash值
for (int i = ; i < ; i++)
{
int tmp = ; //在此后的序列中的位置(升序)
for (int j = i + ; j < ; j++)
if (str[j] < str[i]) tmp++;
num += tmp*fac[ - i];
}
return num;
} //离线打表(BFS)
void Init()
{
queue<Board>Q;
Board t, tmp;
t.str = tmp.str = ""; //初始数组
t.val = Contor(t.str);
v[t.val] = ;
Q.push(t);
while (!Q.empty()) {
t = Q.front();
Q.pop(); // A:交换行
for (int i = ; i < ; i++)
tmp.str[(i + ) % ] = t.str[i]; tmp.val = Contor(tmp.str);
if (!v[tmp.val]) {
v[tmp.val] = ;
ans[tmp.val] = ans[t.val] + 'A';
Q.push(tmp);
} // B:循环右移
for (int i = ; i < ; i++)
tmp.str[(i + ) % ] = t.str[i];
for (int i = ; i < ; i++)
tmp.str[(i + ) % + ] = t.str[i]; tmp.val = Contor(tmp.str);
if (!v[tmp.val]) {
v[tmp.val] = ;
ans[tmp.val] = ans[t.val] + 'B';
Q.push(tmp);
} // C:中心顺时旋转
tmp.str = t.str;
tmp.str[] = t.str[]; tmp.str[] = t.str[];
tmp.str[] = t.str[]; tmp.str[] = t.str[]; tmp.val = Contor(tmp.str);
if (!v[tmp.val]) {
v[tmp.val] = ;
ans[tmp.val] = ans[t.val] + 'C';
Q.push(tmp);
}
}
} int main()
{
Init(); //BFS
string ts, te;
while (cin >> ts >> te)
{
/*转换成顺序魔板*/
swap(ts[], ts[]);
swap(ts[], ts[]);
swap(te[], te[]);
swap(te[], te[]); /*将起始魔板转换为标准魔板,相应目标魔板也进行变更*/
char tmp[];
for (int i = ; i < ; i++)
tmp[ts[i] - ''] = i + '';
for (int i = ; i < ; i++)
te[i] = tmp[te[i] - '']; cout << ans[Contor(te)] << endl;
} return ;
}
ACM/ICPC 之 BFS(离线)+康拓展开 (HDU1430-魔板)的更多相关文章
- ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))
祝大家新年快乐,相信在新的一年里一定有我们自己的梦! 这是一个简化的魔板问题,只需输出步骤即可. 玩具(Toy) 描述 ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时的数字玩具. 该玩具酷似魔方, ...
- hdu1430 魔板(康拓展开 bfs预处理)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- 【HDOJ3567】【预处理bfs+映射+康拓展开hash】
http://acm.hdu.edu.cn/showproblem.php?pid=3567 Eight II Time Limit: 4000/2000 MS (Java/Others) Me ...
- hdu1430魔板(BFS+康托展开)
做这题先看:http://blog.csdn.net/u010372095/article/details/9904497 Problem Description 在魔方风靡全球之后不久,Rubik先 ...
- hdu1430魔板
Problem Description 在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板.魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示.任一时刻魔板的状态可 ...
- HDU1430;魔板(BFS+康托展开)
传送门 题意 给出初始序列与终止序列,给出三种操作,问最少经过几次操作能使初始->终止,输出操作(字典序最小) 分析 字符串只有8个字符,使用康托展开. 1.BFS将所有序列从"123 ...
- ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))
求一条蛇到(1,1)的最短路长,题目不简单,状态较多,需要考虑状态压缩,ZOJ的数据似乎比POj弱一些 POJ1324(ZOJ1361)-Holedox Moving 题意:一条已知初始状态的蛇,求其 ...
- ACM/ICPC 之 BFS范例(ZOJ2913-ZOJ1136(POJ1465))
通过几道经典BFS例题阐述BFS思路 ZOJ2913-Bus Pass 题意:找一个center区域,使得center到所有公交线路最短,有等距的center则输出id最小的. 题解:经典的BFS,由 ...
- POJ-1077 HDU 1043 HDU 3567 Eight (BFS预处理+康拓展开)
思路: 这三个题是一个比一个令人纠结呀. POJ-1077 爆搜可以过,94ms,注意不能用map就是了. #include<iostream> #include<stack> ...
随机推荐
- hdu4951 Multiplication table (乘法表的奥秘)
http://acm.hdu.edu.cn/showproblem.php?pid=4951 2014多校 第八题 1008 2014 Multi-University Training Contes ...
- 解决pydev无法增加jython271 interpreter的问题
============================解决pydev无法增加jython271 interpreter的问题============================ 从jython. ...
- 正确使用Python logging
这篇文章主要参考: http://victorlin.me/posts/2012/08/26/good-logging-practice-in-python ===================== ...
- [百度地图] MultiZMap 修改使用;
MultiZMap修改说明 MultiZMap 是基于百度地图API 封装的一些常用功能类库:主要以prototype方式实现:并且实现了一些辅助的功能,比如添加 Marker 功能,事件管理等: 以 ...
- 文件操作 fopen() fclose()
#define _CRT_SECURE_NO_DEPRECATE /*取消scanf,printf不安全之类的错误提示*/ /* fopen example */ #include <stdio ...
- maven 向本地私库导入jar
mvn install:install-file -DgroupId=<your_group_name> -DartifactId=<your_artifact_name> - ...
- CentOS启用sudo,禁用root远程登录
CentOS默认不启用sudo,且可以直接用超级管理员身份登录服务器.ubuntu这方面做得比较好,为了安全,减小误操作带来的损失,还是推荐启用sudo. 1.添加sudo用户 执行 visudo 命 ...
- 动态修改attr里的多个属性
要点: 1.js将字符串转化为object方法,通过新建函数. 2.通过ajax返回的数据是object类型. 3.jquery.attr()里的attr是object类型 例子:主要实现后台返回的a ...
- Javascript高级程序设计——this、闭包、函数表达式
在javascript中函数声明会被提升,而函数表达式不会被提升.当函数执行时,会创建一个执行环境和相应的作用域链,然后利用arguments和其他的命名参数的值来初始化函数的活动对象,作用域链链中所 ...
- Why Reflection is slowly?(Trail: The Reflection API)
反射的使用 反射通常用于在JVM中应用程序运行中需要检查或者修改运行时行为的项目.这是一个相对高级的特性,并且仅仅可以被对深刻理解java原理的开发者使用.这里给出一个警告的意见,反射是一个强大的技术 ...