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

思路:由于存在多组测试数据,可以考虑“打表法“。所谓打表法,即枚举所有的初始情况,记录其到达终点的路径。而在这个题目中,顺序打表会调用很多次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. Linux下的eclipse的安装

    其实在linux里配好java环境后,就已经好了. 从官网下一个eclipse,解压后,就可以直接执行eclipse了,实在是不知道什么是安装. 其实在配置java时,也是一样. 可见在linux下, ...

  2. linux下安装QQ等EXE文件

    安装好linux系统后,发现linux很多自带的软件用起来很不习惯,于是去网上下载QQ等在Windows下经常使用的exe文件. 发现这些文件无法安装,在网上找了一些解决办法,须下载wine,然后才可 ...

  3. uva11400 Lighting System Design

    题目大意: 有一个照明系统需要用到n种灯,每种灯的电压为V,电源费用K,每个灯泡费用为C,需要该灯的数量为L.注意到,电压相同的灯泡只需要共享一个对应的电源即可,还有电压低的灯泡可以被电压高的灯泡替代 ...

  4. js函数—隐形参数this

    前言 this是函数中的隐形参数,它绑定的值取决于函数的调用位置. this的定义 <你不知道的js>中是这样说的:是函数体内的隐式参数,this就是记录函数调用上下文的一个属性.可以在函 ...

  5. React `controlled` 及 `uncontrolled` 组件

    通过 props 来设置其 value 值的组件便是一种 controlled 组件.典型的 form 表单中,像 输入框 <input> 下拉框 <select> 多选框 & ...

  6. Awesome Blockchain 区块链技术导航

    区块链技术导航:收集整理最全面最优质的区块链(BlockChain)技术开发相关资源. 以后找不到文档资料的时候去导航站看看. 先亮个像,我长这样: 导航站内容 区块链开发所涉及的资源: 如 项目白皮 ...

  7. $SCOJ4427 Miss Zhao's Graph$

    \(problem\) 给定一个包含n个顶点m条边的带权有向图,找一条边数最多的路径,且路径上的边的权值严格递增. 图中可能有重边和自环. \(题意非常简单:n个点 m个带权边 最多能连成多少条边\) ...

  8. day4列表作业详解

    1.day4题目 day4作业 1,写代码,有如下列表,按照要求实现每一个功能 li = ["alex", "WuSir", "ritian" ...

  9. vue教程4-vueadmin上手

    项目地址 https://github.com/PanJiaChen/vue-admin-template 这是一个 极简的 vue admin 管理后台 它只包含了 Element UI & ...

  10. A Simple Math Problem (矩阵快速幂)

    Lele now is thinking about a simple function f(x).  If x < 10 f(x) = x.  If x >= 10 f(x) = a0 ...