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

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

    http://gdc.qq.com/ http://gdc.qq.com/?p=4445

  2. ZOJ - 4104 Sequence in the Pocket(思维+元素移至列首排序)

    Sequence in the Pocket Time Limit: 1 Second      Memory Limit: 65536 KB DreamGrid has just found an ...

  3. HDU - 4704 sum 大数取余+欧拉降幂

    Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submi ...

  4. npm ERR! Cannot read property 'match' of undefined 错误处理

    跟往常一样运行npm install 的时候,突然报错.错误情况如下: npm ERR! Cannot read property 'match' of undefined npm ERR! A co ...

  5. [51nod] 1091 线段的重叠 贪心

    X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]. 给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长 ...

  6. 2014-9-13 NOIP模拟赛

    NOIP2014模拟赛 ——lwher 题目名 环上的游戏 舞蹈课 数位和乘积 源文件 cycle.cpp/c/pas dancingLessons.pas/cpp digit.cpp.cpp/c/p ...

  7. [Xcode 实际操作]六、媒体与动画-(14)使用SystemSoundId播放简短声音

    目录:[Swift]Xcode实际操作 本文将演示如何播放音频素材. 在项目名称上点击鼠标右键,弹出右键菜单, 选择[Add Files to "DemoApp"],往项目中导入文 ...

  8. IT兄弟连 JavaWeb教程 使用Servlet实现在页面中显示随机数

    在com.xdl.servlet包下定义RandomServlet类并HttpServlet类,在该类中生成随机数并发送给客户端.RandomServlet类详细代码如下: package com.x ...

  9. 图像像素灰度内插(Matlab实现)

    常用的像素灰度内插法:最近邻元法.双线性内插法.三次内插法 %%像素灰度内插 factor = 0.75;%缩放比 u = 0.6;v = 0.7; itp1 = uint8(zeros(ceil(h ...

  10. SWT的基本组件使用

    1按钮组件(Button) (1)Button组件常用样式 SWT.PUSH按钮 SWT.CHECK多选按钮 SWT.RADIO单选按钮 SWT.ARROW箭头按钮 SWT.NONE默认按钮 SWT. ...