八数码问题是一个经典的人工智能问题。具体问题不累述了。

思路:由于存在多组测试数据,可以考虑“打表法“。所谓打表法,即枚举所有的初始情况,记录其到达终点的路径。而在这个题目中,顺序打表会调用很多次BFS,所以我们采用逆序打表,只要调用一次BFS。

代码如下:

 /*************map存路径,set判重,string存状态*****************/
/*********************暴力广搜 + STL **************************/
#include<stdio.h>
#include<iostream>
#include<queue>
#include<map>
#include<set>
#include<algorithm>
#include<sstream>
using namespace std;
map<string, string>slu;
set<string>visited;
int dir[][] = { {-,},{,},{,},{,-} };
string base = "udrl";
char input[];
struct node {
string sta;
string path;
int pos; //x所在的位置
node(string stas, string paths, int poss) {
sta = stas;
path = paths;
pos = poss;
}
};
bool check(int x, int y)
{
if (x >= && x < && y >= && y < )
return true;
else
return false;
}
void prv_bfs()
{
queue<node>q;
set<string>v;
q.push(node("12345678x", "", )); //从目标状态往回扩展
slu["12345678x"] = " ";
v.insert("12345678X");
while (!q.empty())
{
struct node h = q.front();
q.pop(); int a = h.pos / ;
int b = h.pos % ; //得到x的坐标
for (int i = ; i < ; i++)
{
int x = a + dir[i][];
int y = b + dir[i][];
int pos = * x + y;
if (!check(x, y))
continue;
swap(h.sta[h.pos], h.sta[pos]);
if (slu.find(h.sta) != slu.end())
{
swap(h.sta[h.pos], h.sta[pos]);
continue;
}
q.push(node(h.sta, h.path + base[i], pos));
slu[h.sta] = h.path + base[i];
v.insert(h.sta);
swap(h.sta[h.pos], h.sta[pos]);
}
}
}
int main()
{
prv_bfs();
while (~scanf("%s", input))
{
string line = "";
line = line + input[];
for (int i = ; i <= ; i++)
{
scanf("%s", input);
line = line + input[];
}
if (slu[line] == "") cout << "unsolvable" << endl;
else cout << slu[line] << endl;
} return ; }

当然,这一题还有很多很好的方法,我会慢慢补充。

新手入门,希望多多交流!

八数码问题(一) 暴力BFS + STL的更多相关文章

  1. HDU-1043 Eight八数码 搜索问题(bfs+hash 打表 IDA* 等)

    题目链接 https://vjudge.net/problem/HDU-1043 经典的八数码问题,学过算法的老哥都会拿它练搜索 题意: 给出每行一组的数据,每组数据代表3*3的八数码表,要求程序复原 ...

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

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

  3. 【P1379】八数码难题(搜索+暴力)

    这个题真是... 不想说什么了,及其复杂和烦人的一道题.基础思路就是bfs,用两个队列分别进行0的位置的计算和每一步的状态..然而这个题最重要的一点在于判重,实际上可以康托展开用全排列的个数进行判重, ...

  4. 洛谷 P1379 八数码难题(map && 双向bfs)

    题目传送门 解题思路: 一道bfs,本题最难的一点就是如何储存已经被访问过的状态,如果直接开一个bool数组,空间肯定会炸,所以我们要用另一个数据结构存,STL大法好,用map来存,直接AC. AC代 ...

  5. hdu1043Eight (经典的八数码)(康托展开+BFS)

    建议先学会用康托展开:http://blog.csdn.net/u010372095/article/details/9904497 Problem Description The 15-puzzle ...

  6. Eight(South Central USA 1998)(八数码) 分类: bfs 2015-07-05 22:34 1人阅读 评论(0) 收藏

    The 15-puzzle has been around for over 100 years; even if you don't know it by that name, you've see ...

  7. 【洛谷P1379】八数码难题 状压bfs

    对于这道题来说,每个时刻的状态是整个棋盘所有棋子的位置,即:任何一个棋子位置发生了移动,都会使得状态转移. 因此,需要采取将整个状态作为广搜的搜索对象,进行状态压缩.采用哈希得到每个状态的对应的数值, ...

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

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

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

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

随机推荐

  1. sqlserver2012——逻辑运算符

    ALL 如果一组的比较都为TRUE,则结果为true ANY如果玉足比较中任何一个为true,则结果为true AND 两个boll都为TRUE,则结果为TRUE OR 两个BOLL任何一个TRUE, ...

  2. 数据库路由中间件MyCat - 源代码篇(1)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 进入了源代码篇,我们先从整体入手,之后拿一个简单流程前端连接建立与认证作为例子,理清代码思路和设计模式.然后 ...

  3. Js获取当前的日期和时间以及时间戳转化为时间

    /** *获取当前时间 *format=1精确到天 *format=2精确到分 */ function getCurrentDate(format) { var now = new Date(); v ...

  4. JQ下拉加载更多

    <!DOCTYPE=html> <html> <head> <script src="jquery-1.4.2.min.js" type= ...

  5. 条件分页 分页条件和页参数传递方式一 超链接拼串 方式二 使用查询表单searchForm

    <%-- Created by IntelliJ IDEA. User: jie Date: 2019/5/10 Time: 20:00 To change this template use ...

  6. [题解](gcd/欧拉函数)luogu_P2568_GCD

    求gcd(x,y)=p等价于求gcd(x/p,y/p)=1,转化为了n/p内互质的个数 所以欧拉函数,因为有序所以乘2,再特判一下只有在1,1情况下才会重复计算,所以每次都减一 数组开小一时爽,提交w ...

  7. 新的JSON / YAML插件:在JMeter中使用YAML

    在JMS插件从jmeter-plugins.org捐赠给核心JMeter之后,JSON插件在Apache JMeter™版本4中被弃用.现在,我已更新此插件以支持新功能和新功能.在这个新版本中,两个插 ...

  8. hdu6062RXD and logic gates多校题 构造

    听说标算的点数是2^(n+1)级别的,也不知道我是不是比标算优一点? (话说这种题一眼看过去怎么跟题答一样) 然而并不是题答,没法手玩,来考虑一下一般解法: 考虑一个规模较小的问题:最后一位一定是0 ...

  9. yii2.0下,JqPaginator与Pjax实现无刷新翻页

    控制器部分 <?php namespace backend\controllers; use common\models\Common; use Yii; use yii\base\Contro ...

  10. idea 卡顿问题

    转载大神总结 https://jingyan.baidu.com/article/c275f6ba14207ee33c756752.html