#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <set>
using namespace std; /*
2 6 4 1 3 7 0 5 8
8 1 5 7 3 6 4 0 2 1 2 3 4 5 0 7 8 6
1 2 3 4 5 6 7 8 0
*/
typedef int State[];
const int maxstate = ;
State st[maxstate], goal; //状态数组, 所有状态都保存在这里
int dist[maxstate]; //距离数组 set<int> vis; //编码
//如果需要打印方案,可以在这里加一个"父亲编号" 数组 int fa[maxstate]
int fa[maxstate]; void init_lookup_table();
int try_to_insert(int s);
int BFS();
void solve(); const int dx[] = {-, , , };
const int dy[] = {, , -, }; void print(State s, int front)
{
for (int i = ; i < ; i++) {
if (i % == ) cout << endl;
cout << st[front][i] << " ";
}
cout << endl;
} bool judge(int x, int y)
{
return (x >= && x < ) && (y >= && y < );
} void init_lookup_table()
{
for (int i = ; i < ; i++) {
scanf("%d", &st[][i]); //起始状态
}
for (int i = ; i < ; i++) {
scanf("%d", &goal[i]);
}
vis.clear();
} int try_to_insert(int s)
{
int code = ; //把st[s]映射到code
for (int i = ; i < ; i++) {
code = code * + st[s][i];
}
if (vis.count(code)) return ;
vis.insert(code);
return ; //HashCode
} //BFS, 返回目标状态在st数组下标
int BFS()
{
init_lookup_table(); //初始化查找表
int front = , rear = ; //不使用下标0, 因为0被看作不存在
while (front < rear) {
State& s = st[front]; //用引用简化代码
if (memcmp(goal, s, sizeof(s)) == ) {
return front; //找到目标状态, 成功返回
}
int z;
for (z = ; z < ; z++) {
if (!s[z]) break; //找“0”的位置
}
int x = z / , y = z % ; //模拟 行, 列
for (int d = ; d < ; d++) { //四个方向
int newx = x + dx[d];
int newy = y + dy[d];
int newz = newx * + newy; //模拟到一维数组的地方 , 空格将要移动到的地方 if (judge(newx, newy)) { //移动合法
State &t = st[rear]; //得到队尾元素
memcpy(&t, &s, sizeof(s)); // 将将 s 添加到队尾 //数字 和 空格交换位置
t[newz] = s[z]; //z位置为 空格
t[z] = s[newz]; dist[rear] = dist[front] + ; //更新新结点的距离值
if (try_to_insert(rear)) rear++; //如果成功插入查找表, 修改队尾指针
}
}
front++; //拓展完毕, 修改队首指针
//打印
print(st[front], front);
}
return ; //失败
} void solve()
{
int ans = BFS();
if (ans > ) printf("%d\n", dist[ans]);
else printf("-1\n");
} int main()
{
solve();
return ;
}

BFS:八数码问题的更多相关文章

  1. BFS(八数码) POJ 1077 || HDOJ 1043 Eight

    题目传送门1 2 题意:从无序到有序移动的方案,即最后成1 2 3 4 5 6 7 8 0 分析:八数码经典问题.POJ是一次,HDOJ是多次.因为康托展开还不会,也写不了什么,HDOJ需要从最后的状 ...

  2. UVALive 6665 Dragon’s Cruller --BFS,类八数码问题

    题意大概就是八数码问题,只不过把空格的移动方式改变了:空格能够向前或向后移动一格或三格(循环的). 分析:其实跟八数码问题差不多,用康托展开记录状态,bfs即可. 代码: #include <i ...

  3. [cdoj1380] Xiper的奇妙历险(3) (八数码问题 bfs + 预处理)

    快要NOIP 2016 了,现在已经停课集训了.计划用10天来复习以前学习过的所有内容.首先就是搜索. 八数码是一道很经典的搜索题,普通的bfs就可求出.为了优化效率,我曾经用过康托展开来优化空间,甚 ...

  4. 八数码问题+路径寻找问题+bfs(隐式图的判重操作)

    Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...

  5. HDU 1043 Eight (BFS&#183;八数码&#183;康托展开)

    题意  输出八数码问题从给定状态到12345678x的路径 用康托展开将排列相应为整数  即这个排列在全部排列中的字典序  然后就是基础的BFS了 #include <bits/stdc++.h ...

  6. 【算法】BFS+哈希解决八数码问题

    15拼图已经有超过100年; 即使你不叫这个名字知道的话,你已经看到了.它被构造成具有15滑动砖,每一个从1到15上,并且所有包装成4乘4帧与一个瓦块丢失.让我们把丢失的瓷砖“X”; 拼图的目的是安排 ...

  7. hdu-1043(八数码+bfs打表+康托展开)

    参考文章:https://www.cnblogs.com/Inkblots/p/4846948.html 康托展开:https://blog.csdn.net/wbin233/article/deta ...

  8. Poj 1077 eight(BFS+全序列Hash解八数码问题)

    一.题意 经典的八数码问题,有人说不做此题人生不完整,哈哈.给出一个含数字1~8和字母x的3 * 3矩阵,如: 1  2  X            3 4  6            7  5  8 ...

  9. HDU1043 八数码(BFS + 打表)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 , 康托展开 + BFS + 打表. 经典八数码问题,传说此题不做人生不完整,关于八数码的八境界 ...

  10. 习题:八数码难题(双向BFS)

    八数码难题(wikioi1225) [题目描述] 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出 ...

随机推荐

  1. Week2-作业1-part2.阅读与思考

    第一章.概论 原文: 在成熟的航空工业中,一个飞机发动机从构思到最后运行,不知道经历过多少人.多少工序.多少流程.多少相关知识的验证.我们无法想象,某个商用型号的发动机在飞行时发现问题,最初的设计师会 ...

  2. 51单片机,keilc51,如何使用data变量超过128怎么办

    将堆栈指针SP指向128之后.如果你定义了数组.将数组定义为Idata.很难想象单个变量使用,你能用尽128个data类内存单元.如果真的用尽了,那只有将访问频率低的内存单元放到idata类去.总之, ...

  3. XMind2TestCase:一个高效测试用例设计的解决方案!

    一.背景 软件测试过程中,最重要.最核心就是测试用例的设计,也是测试童鞋.测试团队日常投入最多时间的工作内容之一. 然而,传统的测试用例设计过程有很多痛点: 1.使用Excel表格进行测试用例设计,虽 ...

  4. PHP导出sql文件

    发现自己之前写的php导出sql数据为Excel文件在导出一些数据的时候出现了精度的问题,比如导出身份证号的时候会把后面变成0000.暂时先把这个问题留下,有空去看看到底是什么问题. 写了一个导出sq ...

  5. Handler,Looper,HandlerThread浅析

    Handler想必在大家写Android代码过程中已经运用得炉火纯青,特别是在做阻塞操作线程到UI线程的更新上.Handler用得恰当,能防止很多多线程异常. 而Looper大家也肯定有接触过,只不过 ...

  6. 【BZOJ1801】【Ahoi2009】chess 中国象棋

    Time Limit: 10 Sec Memory Limit: 64 MB Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方 ...

  7. 【Cf #292 D】Drazil and Morning Exercise(树的直径,树上差分)

    有一个经典的问题存在于这个子问题里,就是求出每个点到其他点的最远距离. 这个问题和树的直径有很大的关系,因为事实上距离每个点最远的点一定是直径的两个端点.所以我们可以很容易地进行$3$遍$Dfs$就可 ...

  8. 移动端图片轮播—swipe滑动插件

    swipe是一个轻量级的移动滑动组件,它可以支持精确的触滑移动操作,能解决移动端对滑动的需求. swipe插件的使用主要有四大块: 一.html <div id='slider' class=' ...

  9. 在mvc中 怎么给@Html.HiddenFor()赋值

    @Html.HiddenFor(model => model.CreatedBy, new { @value=currentInfo.UserID}) value始终是null@Html.Tex ...

  10. OpenCV-跟我学一起学数字图像处理之中值滤波

    中值滤波(median filter)在数字图像处理中属于空域平滑滤波的内容(spatial filtering).对消除椒盐噪声具有很好的效果. 数学原理 为了讲述的便捷,我们以灰度图为例.RGB三 ...