八数码问题实现(裸BFS版+A*版)C++实现

本文介绍了八数码问题的背景和解决方案,通过C++实现BFS和A*两种算法来寻找从初始状态到目标状态的最短移动步骤。文章包含若干测试数据及对应结果,并提供了相关代码示例。
摘要由CSDN通过智能技术生成

八数码问题也称为九宫问题。在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同。棋盘上还有一个空格,与空格相邻的棋子可以移到空格中。要求解决的问题是:给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤。
所谓问题的一个状态就是棋子在棋盘上的一种摆法。棋子移动后,状态就会发生改变。解八数码问题实际上就是找出从初始状态到达目标状态所经过的一系列中间过渡状态。

人工智能课的作业。感觉一点都不智能。。
算法核心是bfs hash用的是康拓展开
输入是第一行是初始状态,第二行是终止状态,空格用0表示。
012
345 ———> 012345678
678
一些测试数据:
012345678
102345678

103425678
123405678

123045678
123405678

123475608
123405678

123450678
123405678

234150768
123456780

结果:
最少步数为:1
路径为:r

最少步数为:1
路径为:d

最少步数为:1
路径为:r

最少步数为:1
路径为:u

最少步数为:1
路径为:l

最少步数为:19
路径为:ullddrurdllurdruldr

下面贴两个版本的代码

裸BFS版
参考kuangbin的HDU1043的代码写的,因为自己原先写了一个觉得很丑,还是大佬的姿势比较优美。


#include "cstdio"
#include "queue"
#include "cstring"
#include "string.h"
#include "iostream"
#include "algorithm"
#include "cmath"
#include "vector"
using namespace std;
const int MAXN=1000000;
int fac[]={
  1,1,2,6,24,120,720,5040,40320,362880};//康拖展开判重
//         0!1!2!3! 4! 5!  6!  7!   8!    9!
bool vis[MAXN];//标记
string path;
int aim;//123456780对应的康拖展开的hash值
int aimmap[3][3];
int mymove[4][2]={
  {-1,0},{
  1,0},{
  0,-1},{
  0,1}};//u,d,l,r
char indexs[5]="udlr";//正向搜索
int cantor(int s[])//康拖展开求该序列的hash值
{
    int sum=0;
    for(int i=0;i<9;i++)
    {
        int num=0;
        for(int j=i+1;j<9;j++)
            if(s[j]<s[i])num++;
        sum+=(num*fac[9-i-1]);
    }
    return sum+
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值