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> ... 
随机推荐
- 深入理解Java:注解(Annotation)--注解处理器
			如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处 ... 
- 新浪微博客户端(34)-block的细节与本质
			main.m #import <Foundation/Foundation.h> void test4(); int main(int argc, const char * argv[]) ... 
- 关于PHP位运算的简单权限设计
			写在最前面 最近想写一个简单的关于权限处理的东西,之前我也了解过用二进制数的位运算可以出色地完成这个任务.关于二进制数 的位运算,常见的就是“或.与.非”这三种简单运算了,当然,我也查看了下PHP手册 ... 
- 服务器上的json类型的文件提示找不到
			搞Google地图的时候, 本地是可以显示的, 但是到了服务器上地图一直显示不出来, 火狐打开F12,发现是找不到json的文件, 本来还以为是IIS中"请求筛选"的问题,后来发现 ... 
- Linux中postfix邮件服务器的搭建
			postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件.postfix是Wietse Venema想要为使用最广泛的sendmail提供替代品的一个尝试.在 ... 
- 大数据——sparksql
			sparksql:http://www.cnblogs.com/shishanyuan/p/4723604.html?utm_source=tuicool spark on yarn :http:// ... 
- javacomm64位用不了,可以使用RXTXcomm for x64
			安装完后把导入包名改一下就行了! 附上读串口代码: /* * @(#)SimpleRead.java 1.12 98/06/25 SMI * * Copyright (c) 1998 Sun Micr ... 
- UI第三节—— UITextField详解
			戏言:UITextField对于需要登陆注册的界面的作用还是相当明显,但是对于键盘过的遮挡问题,可是重点哦!这里就涉及到通知(NSNotificationCenter)的内容. //注册事件 [[NS ... 
- oracle 行列转换的运用
			问题: 员工表: A(E_ID,NAME,) 部门表: B(D_ID,D_NAME) 员工与部门关系:C(ID,E_ID,D_ID) SELECT A.E_ID,A.NAME ,B.D_NAME ... 
- Android应用中返回键的监听及处理
			MainActivity: package com.testnbackpressed; import android.os.Bundle; import android.view.KeyEvent ... 
