八数码问题

利用启发式搜索,找出以下问题的最优解。

#include <iostream>
#include <vector>
#include <algorithm> using namespace std; const int BLANK = 0;
const int R = 3;
const int C = 3; pair<int, int> find_blank(const vector<vector<int>> &m) {
for (int r = 0; r < m.size(); r++) {
for (int c = 0; c < m[r].size(); c++) {
if (m[r][c] == BLANK) {
return make_pair(r, c);
}
}
}
return make_pair(-1, -1);
} vector<pair<int, int>> address_derive(const pair<int, int> &father) {
vector<pair<int, int>> addresses;
const int r = father.first, c = father.second;
if (r - 1 >= 0) {
addresses.push_back(make_pair(r - 1, c));
}
if (r + 1 < R) {
addresses.push_back(make_pair(r + 1, c));
}
if (c - 1 >= 0) {
addresses.push_back(make_pair(r, c - 1));
}
if (c + 1 < C) {
addresses.push_back(make_pair(r, c + 1));
}
return addresses;
} vector<vector<vector<int>>> matrix_derive(const vector<vector<int>> &father) {
vector<vector<vector<int>>> matrices;
pair<int, int> address = find_blank(father);
vector<pair<int, int>> addresses = address_derive(address);
for (const auto e : addresses) {
int r = e.first, c = e.second;
vector<vector<int>> son = father;
swap(son[address.first][address.second], son[r][c]);
matrices.push_back(son);
}
return matrices;
} int evaluate(const vector<vector<int>> &m, const vector<vector<int>> &goal) {
int difference = 0;
for (int r = 0; r < goal.size(); r++) {
for (int c = 0; c < goal[r].size(); c++) {
if (goal[r][c] == BLANK) {
continue;
}
difference = m[r][c] != goal[r][c] ? difference + 1 : difference;
}
}
return difference;
} struct Block {
int g;
int h;
vector<vector<int>> m;
Block(int g = 0, int h = 0, vector<vector<int>> m = vector<vector<int>>())
:g(g), h(h), m(m) {};
}; void print(const Block &b) {
for (const auto r : b.m) {
for (const auto c : r) {
cout << c << " ";
}
cout << endl;
}
cout << b.g << " " << b.h << endl;
cout << endl;
} bool in_close(const vector<vector<vector<int>>> &close, const vector<vector<int>> &m) {
for (auto e : close) {
if (e == m) {
return true;
}
}
return false;
} bool in_open(const vector<Block> &open, const vector<vector<int>> &m) {
for (auto e : open) {
if (e.m == m) {
return true;
}
}
return false;
} void search(const vector<vector<int>> &begin, const vector<vector<int>> &goal) {
vector<Block> open;
vector<vector<vector<int>>> close;
open.push_back(Block(0, evaluate(begin, goal), begin));
int g = 0;
while (open.size()){
sort(open.begin(), open.end(), [](const Block &lhs, const Block &rhs) {
return (lhs.g + lhs.h) < (rhs.g + rhs.h);
}); Block cur = open.front();
open.erase(open.begin());
close.push_back(cur.m); print(cur); if (cur.m == goal) {
break;
} vector<vector<vector<int>>> matrices = matrix_derive(cur.m); for (auto e : matrices) {
if(!in_open(open, e)){
if (!in_close(close, e)) {
open.push_back(Block(cur.g+1, evaluate(e, goal), e));
}
}
}
}
} int main() {
vector<vector<int>> begin = { {2,1,6},{4,0,8},{7,5,3} };
vector<vector<int>> goal = { {1,2,3}, {8,0,4}, {7,6,5} }; search(begin, goal); return 0;
}

八数码问题 Eight Digital Problem的更多相关文章

  1. 八数码问题(8-Puzzle Problem)

    八数码问题(8-Puzzle Problem) P1379 八数码难题 - 洛谷 题目概述:在 \(3 \times 3\) 的棋盘上摆放着 \(8\) 个棋子,棋子的编号分别为 \(1\) 到 \( ...

  2. hdu 1043 Eight 经典八数码问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 The 15-puzzle has been around for over 100 years ...

  3. poj 1077-Eight(八数码+逆向bfs打表)

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

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

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

  5. HDU 3567 Eight II(八数码 II)

    HDU 3567 Eight II(八数码 II) /65536 K (Java/Others)   Problem Description - 题目描述 Eight-puzzle, which is ...

  6. HDU 1043 Eight(八数码)

    HDU 1043 Eight(八数码) 00 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)   Problem Descr ...

  7. Eight(经典题,八数码)

    Eight Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  8. Codeforces 645A Amity Assessment【八数码】

    题目链接: http://codeforces.com/problemset/problem/645/A 题意: 2*2的八数码问题 分析: 这题n为2,不需要搜索,直接判断字母排列顺序就好了. 注意 ...

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

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

随机推荐

  1. IIS预编译提升加载速度

    当我们把网站部署在IIS7或IIS6S的时候,每当IIS或是ApplicationPool重启后,第一次请求网站反应总是很慢,原因大家都知道(不知道可以参考这个动画说明ASP.NET网页第一个Requ ...

  2. R语言的scale函数

    1.数据的中心化 所谓数据的中心化是指数据集中的各项数据减去数据集的均值. 例如有数据集1, 2, 3, 6, 3,其均值为3 那么中心化之后的数据集为1-3,2-3,3-3,6-3,3-3,即:-2 ...

  3. Cocos2d-JS studio基础控件的使用

    在studio里把几个基础控件往场景文件一拖,然后导出json格式的资源文件 逻辑代码如下: 1 var HelloWorldLayer = cc.Layer.extend({ 2 sprite:nu ...

  4. jquery评分效果Rating精华版

    参考:https://blog.csdn.net/bluceyoung/article/details/8573629

  5. 如何使用js判断当前页面是pc还是移动端打开的

    1.利用了正则表达式和三目运算符,含义就是如果是移动端打开的话那就跳转到 "https:www.baidu.com/" ,如果不是就跳转到"http://new.baid ...

  6. sqli-labs(八)——修改密码处sql注入+http头sql注入

    第17关: 这是一个重置密码的功能存在sqk注入,尝试账号密码都输入'",发现只会显示登陆失败,没有报错信息. 这个时候先推测一下后台的sql形式大概应该是: update users se ...

  7. springboot的默认访问路径

    注意:默认配置的/**映射到/static(或/public ,/resources,/META-INF/resources) 当请求/index.html的时候,Spring MVC 会在/stat ...

  8. leetcode Sort List 对链表进行排序

    描述: Sort a linked list in O(n log n) time using constant space complexity. 在O(n*log(n))的时间复杂度,常数级空间复 ...

  9. Redis Cluster(集群)的搭建

    一.Redis的下载.安装.启动(单实例) 我们统一将Redis安装在/opt目录下,执行命令如下: $ cd /opt $ wget http://download.redis.io/release ...

  10. 【Redis学习之六】Redis数据类型:集合和有序集合

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 redis-2.8.18 一.集合 Set无序的.去重的元素 ...