魔板问题,一道经典的康拓展开+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. 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库

      最近在编写的一个Apache  kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a    静态库编译的,,,而我们这 ...

  2. javascript的对象 和 JSON 对象?

    关于js和JSON的 一篇 好文章: http://www.68idc.cn/help/makewebs/javascript/20150704416007.html 讲的很好 很易懂 在将javas ...

  3. Windows 操作小技巧 之一(持续更新)

    1.图片批量旋转 通常携带单反去景点排了大量照片回来处理图片时都会遇到很多横竖杂乱排序的图片难以处理的情形.现提供如下技巧进行处理. 1).在文件夹中添加"方向"的排列或分组选项: ...

  4. HDOJ 4768 Flyer

    二分.... Flyer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  5. HDOJ 1711 Number Sequence

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. jquery mobile cannot be created in a document with origin 'null' and URL

    jquery mobile cannot be created in a document with origin 'null' and URL http://zhidao.baidu.com/lin ...

  7. 类调用类的protected或private的成员函数或成员变量

    1.在其中一个类定义友元函数,则可以实现该类直接使用另外类的里所有内容. 一般实例化两个类,友元类以及自身类,实现友元类传递指针到自身类 2.如果两个类是可以继承的关系,则在子类里继承该类,实现在子类 ...

  8. 如何让网页在浏览器标题栏显示自己制作的图标ico

    第一步,制作一个尺寸16x16大小的PNG图片,可以用photoshop等图片处理工具来设计,然后保存到本地电脑上,通过ico在线制作或使用IconWorkshop工具制作ICO图标,ico图标命名为 ...

  9. HashMap原理分析

    HashMap 实现Map.Cloneable.Serializable接口,继承AbstractMap基类. HashMap map = new HashMap(); 实例化一个HashMap,在构 ...

  10. 扩展RBAC用户角色权限设计方案

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...