魔板问题,一道经典的康拓展开+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. JQ实现右下角scrollTop()事件

    废话不多说,先贴代码 <script> $(document).ready(function(){ $("#id").hide(); $(function(){ // ...

  2. 卸载金山猎豹免费WIfi后,上不了网的解决办法

    进入网络和共享中心,打开网络适配器,右键无线连接,属性,就在打开属性的那个页面,在靠上的位置有个LieBao xxx Driver,卸载. 然后,打开浏览器,试试这个链接:www.baidu.com. ...

  3. Highcharts X轴名称太长,如何设置下面这种样式

      Highcharts所有的图表除了饼图都有X轴和Y轴,默认情况下,x轴显示在图表的底部,y轴显示在左侧(多个y轴时可以是显示在左右两侧),通过chart.inverted = true 可以让x, ...

  4. C#委托全解析

    什么是委托?                                                                                       委托类似于C语 ...

  5. jelq

    初级 The Newbie Routine 5 minutes hot wrap 5 minutes manual stretch (ten 30-second stretches) 10 minut ...

  6. ELK日志分析系统搭建(转)

    摘要: 前段时间研究的Log4j+Kafka中,有人建议把Kafka收集到的日志存放于ES(ElasticSearch,一款基于Apache Lucene的开源分布式搜索引擎)中便于查找和分析,在研究 ...

  7. ELK常见错误分析(转)

    ELK 常见错误处理   ELK 这里就不介绍了,如何安装请参考博客之前的文章.在这里感谢ttlsa团队,同时,我很荣幸能加入到ttlsa团队中,分享点滴,凉白开说发文章有红包,期待这篇群主能给多少红 ...

  8. java 练手 谁是最好的Coder

    Problem A 谁是最好的Coder 时间限制:1000 ms  |  内存限制:65535 KB   描述 计科班有很多Coder,帅帅想知道自己是不是综合实力最强的coder. 帅帅喜欢帅,所 ...

  9. HDOJ 4336 Card Collector

    容斥原理+状压 Card Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  10. STM32F10xx CAN BUS相关库文件"stm32f10x_can.c"内的库函数解析

    一.背景: 还是继续CAN通信,要节省开发时间,使用库函数可大大降低开发周期,并且还能确保寄存器的配置几 乎是万无一失,所以,在此就STM32F10xx的CAN操作库函数的使用做个简析. STM32有 ...