资源简介

人工智能的八数码的深度优先算法c++实现

资源截图

代码片段和文件信息

/*宽度优先算法中,我定义了一个状态结构来描述每个状态,用一个数组来存放操作符,用continue来判断可否进行某些操作。根据宽度优先算法搜索出
到达目标状态的路径。路径用一个数组来存储,输出时用逆序输出,即为正序结果。*/

#include 
#include 
using namespace std;

struct Snode //表结构
{
int parent;  //父节点的编号
int current[9]; //当前节点
public:
void TransformIn(const int *d);//更换当前节点
};


Snode OPEN[50000];
int op = 0;//OPEN表中的个数
Snode CLOSE[50000];
int cp = 0;//CLOSED表中的个数
int result[50000][9];   //result数组用于保存路径


void Snode::TransformIn(const int *d)
{
    for(int i=0;i<9;++i)
current[i]=d[i];
}

int have_exist(Snode &node1Snode &node2)                                       //判断是否已存在该节点
{
int flag=1;
for(int i=0;i<9;i++)
{
if(node1.current[i]!=node2.current[i]) flag=0;
}
return flag;
}

inline void swapn(int &aint &b)
{
int tmp=a;
    a=b;
    b=tmp;
}

int judge(Snode &node)                                                         //判断节点是否为目标节点
{
int flag=1;
int g[9]={123804765};
for(int i=0;i<9;i++)
{
if(node.current[i]!=g[i])
flag=0;
}
return flag;
}

int Astar(const int *d)                                                       //深度优先算法实现
{
int step = 0;
int begin=0;                    //当前扩展的节点
int node_number=1;              //生成状态总数
static int dp[4]={-3-113};   //移动操作符:上、左、右、下
    op=1;
    cp=0;
    OPEN[begin].TransformIn(d);
OPEN[begin].parent=-1;//根节点的parent为-1
    while(op>0)//OPEN表不为空
{
int i=0zeroposj=0k=0;

/////////////////////////////////////找到目标节点->输出路径
        if(judge(OPEN[begin])==1)  
{
CLOSE[cp]=OPEN[begin]; //被扩展的节点放入CLOSED表中
while(begin!=-1)         //记录路径
{
               for(int i=0;i<9;i++)
   {
   result[j][i]=OPEN[begin].current[i];
   }
   j=j+1;
   begin=OPEN[begin].parent;
}
for(i=j-1;i>=0;i--)//正序输出路径
{
cout << “第“ << step++ << “步“ << endl;
for(k=0;k<9;k++)
{
cout<
    if(k%3==2)  cout< }
cout << “ |“ << endl;
cout<

评论

共有 条评论