1、程序源代码
#包含
#包含
结构节点{
int a[3][3];//二维排列存储8个数字
int hx; //函数h(x )值表示与目标状态的差
结构节点*父项; //指向父节点的指针
结构节点*下一步; //指向链表中下一个节点的指针
(;
//hx函数/
inthx(ints[3][3] ) )。
//函数说明:计算s和目标状态之间的差值
int i,j;
int hx=0;
intsg [3] [3]={ 1,2,3,8,0,4,7,6,5 };
for(I=0; i3; I )
for(j=0; j3; j )
if(s ) I ) j )!=sg[i][j] )
hx;
返回hx;
}
//hx函数end//
//extend扩展函数/
sructnode*extend(node*ex ) )。
//函数说明:扩展ex指向的节点,将扩展的节点合并为一个
//单链表,head指定该链表的开头节点,作为返回值
int i,j,m,n; //循环变量
int t; //临时替换变量
int flag=0;
int x[3][3]; //暂时保存二维数组
结构节点* p、*q、*head;
head=(node* ) malloc ) sizeof (node ); //head
p=head;
q=head;
头下一个=空; //初始化
for(I=0; i3; 找出I//二维数组中0的位置
{
for(j=0; j3; j )
选定文档
if(ex-a(I ) j )==0) ) ) )
{
flag=1;
布雷克;
}
if(flag==1) )。
布雷克;
}
for(m=0; m3; 为m//x分配ex-a
for(n=0; n3; n )
x[m][n]=ex-a[m][n];
根据//0的位置,进行与x对应的变换
//情况1
if(I-1=0) )
{
t=x[i][j]; x[i][j]=x[i-1][j]; x[i-1][j]=t;
flag=0;
for(m=0; m3; m )将//x分配给a
for(n=0; n3; n )
if(x[m][n]==ex-parent-a[m] () ) ) ) ) )。
闪光灯;
If (标志!=9)
{
q=(node* ) malloc ) sizeof (node );