问题描述
  如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动,可以形成第二个图所示的局面。

我们把第一个图的局面记为:12345678.
  把第二个图的局面记为:123.46758
  显然是按从上到下,从左到右的顺序记录数字,空格记为句点。
  本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。
输入格式
  输入第一行包含九宫的初态,第二行包含九宫的终态。
输出格式
  输出最少的步数,如果不存在方案,则输出-1。
样例输入
12345678.
123.46758
样例输出
3
样例输入
13524678.
46758123.
样例输出
22
状态之间的转移,运用双向广度优先搜索
双向广度优先搜索比一般的广搜要快,因为会减少大量状态的遍历,从起点和终点同时进行广搜,每次选择小的队列搜索,使用不同的标记,区分未出现过得状态和分别出现在两个队列中的状态。

#include<iostream>
#include<queue>
#include<map>
using namespace std;
string source;
string result;
int nex[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
map<string, int> known;//判断该状态是否出现过,以及在哪个队列出现过
map<string, int> level;//记录节点的层次
string swap(string temp, int x, int y)
{string str = temp;char c = str[x];str[x] = str[y];str[y] = c;return str;
}
int dbfs()
{if(source == result)return 0;queue<string> q1, q2;q1.push(source);q2.push(result);known[source] = 1;known[result] = 2;while(!q1.empty() && !q2.empty()){string front;int flag;if(q1.size() < q2.size()){front = q1.front();q1.pop();flag = 1;}else{front = q2.front();q2.pop();flag = 2;}int dot = front.find('.');int x = dot / 3; //对应九宫格中的行 int y = dot % 3;//对应九宫格中的列 for(int k = 0;k < 4;k++){int nextx = x + nex[k][0];int nexty = y + nex[k][1];if(nextx >= 0 && nextx < 3 && nexty >= 0 && nexty < 3){int nextPos = nextx*3 + nexty;string now = swap(front, dot, nextPos);//获得新的状态if(known[front] + known[now] == 3)//相遇 {return level[front] + level[now] + 1;}else{if(known[now] == 0)//该状态之前未曾遇到过 {if(flag == 1){q1.push(now);}else{q2.push(now);}known[now] = known[front];level[now] = level[front] + 1;}}}}}return -1; }
int main(void)
{cin >> source >> result;cout << dbfs();return 0;
}

试题 历届试题 九宫重排(双向广搜)相关推荐

  1. 【图论专题】BFS中的双向广搜 和 A-star

    双向广搜 AcWing 190. 字串变换 #include <cstring> #include <iostream> #include <algorithm> ...

  2. 算法提高课-搜索-双向广搜 AcWing 190. 字串变换:bfs、双向bfs、queue和unordered_map

    题目分析 来源:acwing 分析: 双向广搜主要用在最小步数模型(也称状态图模型)里面,这里整个状态空间一般是指数级别的,用双向广搜可以极大地提高运行效率. 双向广搜,顾名思义,就是从起点和终点都进 ...

  3. 试题 历届试题 包子凑数(dp)

    试题 历届试题 包子凑数 资源限制 时间限制:1.0s 内存限制:256.0MB 0x00 问题描述 小明几乎每天早晨都会在一家包子铺吃早餐.他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包 ...

  4. 试题 历届试题 幸运数(二分)

    试题 历届试题 幸运数 资源限制 时间限制:1.0s 内存限制:256.0MB 题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然 ...

  5. 试题 历届试题 翻硬币(贪心)

    试题 历届试题 翻硬币 资源限制 时间限制:1.0s 内存限制:256.0MB Work hard,Play harder. 问题描述 小明正在玩一个"翻硬币"的游戏. 桌上放着排 ...

  6. 试题 历届试题 买不到的数目(dp/数学)

    试题 历届试题 买不到的数目 资源限制 时间限制:1.0s 内存限制:256.0MB $Daily English 曾几何时,我流连梦境,心比天高,人生充满希望. I dreamed a dream ...

  7. 试题 历届试题 带分数(全排列)

    试题 历届试题 带分数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 ...

  8. 双向广搜 8数码问题

     转载自:http://blog.sina.com.cn/s/blog_8627bf080100ticx.html  Eight 题目链接:http://acm.hdu.edu.cn/showprob ...

  9. poj 3131 Cubic Eight-Puzzle 双向广搜 Hash判重

    挺不错的题目,很锻炼代码能力和调试能力~ 题意:初始格子状态固定,给你移动后格子的状态,问最少需要多少步能到达,如果步数大于30,输出-1. 由于单向搜索状态太多,搜到二十几就会爆了,所以应该想到双向 ...

  10. java 试题 历届试题 单词分析 题解

    试题 历届试题 单词分析 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度 ...

最新文章

  1. It is not safe to rely on the system's timezone settings
  2. grafana官方使用文档_可视化监控展示工具之Grafana,安装部署和使用
  3. mysql三锁,mysql锁机制之表锁(三)
  4. 13 种在 Linux 系统上检测 CPU 信息的工具
  5. 使用React和Spring Boot构建一个简单的CRUD应用
  6. 计算机问题求解需要研究的要素,关于计算机音乐制作的空间构成要素的研究
  7. 2018.6清北学堂day3下午笔记
  8. 阿里云天池机器学习task3
  9. C++知识讲解(一)
  10. windows10许可证即将过期怎么办_Windows 7 时代即将终结!
  11. python实现随机密码生成
  12. Ubuntu释放缓存/内存和显存
  13. Navicat中如何调试存储过程
  14. 电影票在线选座API接口电影排期场次
  15. MonoRail学习笔记四:MonoRail基本流程分析
  16. Java图片处理 - 复制
  17. Android系统apps之Setting的修改和设置
  18. android+学籍管理,论文基于android的学籍管理系统的设计与实现.doc
  19. 用devc++表白_想谈一场甜甜的姐弟恋了 | 肇院表白墙716期
  20. 惠普中国CEO孙振耀退休感言【转】

热门文章

  1. uVision2和uVision4与proteus7联调详解
  2. 少年, 我看你骨骼惊奇, 送你一套精选 Java 面试题
  3. Swift中的_(下划线)是什么意思
  4. 最令人蛋疼的10种用户体验设计师
  5. Java管理扩展指南之MBean简介
  6. 关于Vue中的v-if和v-for区别讲解
  7. 三菱FX3U与4台台达变频器通讯说明:用三菱FX3U的PLC实现与4台台达变频器modbus通讯
  8. 如何在 Win7 下一键清空剪贴板
  9. Windows截取gif动态图的软件 ScreenToGif 的安装、使用教程
  10. Trait 是什么?