魔板问题,一道经典的康拓展开+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-魔板)的更多相关文章

  1. ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))

    祝大家新年快乐,相信在新的一年里一定有我们自己的梦! 这是一个简化的魔板问题,只需输出步骤即可. 玩具(Toy) 描述 ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时的数字玩具. 该玩具酷似魔方, ...

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

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

  3. 【HDOJ3567】【预处理bfs+映射+康拓展开hash】

    http://acm.hdu.edu.cn/showproblem.php?pid=3567 Eight II Time Limit: 4000/2000 MS (Java/Others)    Me ...

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

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

  5. hdu1430魔板

    Problem Description 在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板.魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示.任一时刻魔板的状态可 ...

  6. HDU1430;魔板(BFS+康托展开)

    传送门 题意 给出初始序列与终止序列,给出三种操作,问最少经过几次操作能使初始->终止,输出操作(字典序最小) 分析 字符串只有8个字符,使用康托展开. 1.BFS将所有序列从"123 ...

  7. ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))

    求一条蛇到(1,1)的最短路长,题目不简单,状态较多,需要考虑状态压缩,ZOJ的数据似乎比POj弱一些 POJ1324(ZOJ1361)-Holedox Moving 题意:一条已知初始状态的蛇,求其 ...

  8. ACM/ICPC 之 BFS范例(ZOJ2913-ZOJ1136(POJ1465))

    通过几道经典BFS例题阐述BFS思路 ZOJ2913-Bus Pass 题意:找一个center区域,使得center到所有公交线路最短,有等距的center则输出id最小的. 题解:经典的BFS,由 ...

  9. POJ-1077 HDU 1043 HDU 3567 Eight (BFS预处理+康拓展开)

    思路: 这三个题是一个比一个令人纠结呀. POJ-1077 爆搜可以过,94ms,注意不能用map就是了. #include<iostream> #include<stack> ...

随机推荐

  1. jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别详细讲解

    1.(function($) {…})(jQuery); 1).原理: 这实际上是匿名函数,如下: function(arg){…} 这就定义了一个匿名函数,参数为arg 而调用函数时,是在函数后面写 ...

  2. [MongoDB]对数组操作

    摘要 在实际开发中遇到更新某个document中的数组的值,这里做一下记录. 这里使用的驱动为 using MongoDB.Bson;using MongoDB.Driver; 相关文章 [Mongo ...

  3. 说说C#的async和await(转)

    一个简单的例子: public class MyClass { public MyClass() { DisplayValue(); //这里不会阻塞 System.Diagnostics.Debug ...

  4. 利用Node.js对某智能家居服务器重构

    原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 之前负责过一个智能家居项目的开发,外包重庆一家公司的,我们主要开发服务器监控和集群版管理. 移动端和机顶盒的远程通信是用 ...

  5. 理解CSS3中的background-size(对响应性图片等比例缩放)

    理解CSS3中的background-size(对响应性图片等比例缩放) 阅读目录 background-size的基本属性 给图片设置固定的宽度和高度的 固定宽度400px和高度200px-使用ba ...

  6. JavaWeb学习总结(五十)——文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  7. JSON 问题

    {"statusCode":"300","message":"栏目插入出现故障==bannerInfoService.add 栏目 ...

  8. 使用xp光盘修复系统的方法步骤

    对于使用Windows XP系统的朋友来说,当系统出现崩溃或者系统使用时出现一些莫名其妙的错误时,你采用什么方法解决呢?一般都是采用重装系统或者使用Ghost恢复等. 但是使用这些方法各有缺陷,比如重 ...

  9. media

    关于获取设备的大小问题: /* 本条为CSS2部分,IE8及以下只支持本条 */@media screen{ body{color:#f00;}}/* 下列为CSS3部分 */@media scree ...

  10. PPPoE名词解释

    PPPoE拔号的发现阶段(Discovery): PPPoE的发现阶段一共分为4步. 分别是: PADI(PPPoE Active Discovery Initiation) PADO(PPPoE A ...