文档介绍:算法描述:步1把初始节点S0放入OPEN表中,计算h(S0);步2若OPEN表为空,则搜索失败,退出;步3取OPEN表中前面第一个节点N放入CLOSED表中;步4若目标节点Sg=N,则搜索成功,结束;步5若N不可扩展,则转步2。步6扩展N,计算每个子节点x的函数值h(x),并将所有子节点配上指向N的返回指针放入OPEN表中,再对OPEN表中的所有子节点按其函数值大小以升序排序,转步2。实验代码:#include<>#include<>#include<>#defineOverflow1#defineN3intgoal[N][N]={1,2,3,8,0,4,7,6,5};intzero[2],NodeQTY=0;int*z=zero;//记录0的位置,zero[0]:r行;zero[1]:c列typedefintPiece;structChessboard{//棋盘信息 Piecepos[N][N];//记录每个数码a的位置r行c列 intd,f,move;//d:深度;f:启发函数值;move:父节点移动到该节点的方式};structLNode{ Chessboardboard; LNode*parent,*next; boolflag;};typedefLNode*List;int*Findzero(LNode*&Node){ inti,j,zr[2]; int*z=zr; for(i=0;i<N;i++){ for(j=0;j<N;j++){ if(Node->[i][j]==0){ zr[0]=i+1; zr[1]=j+1; break; } } } returnz;}intWrong(LNode*Node){ intw=0,i,j; for(i=0;i<N;i++){ for(j=0;j<N;j++){ if(Node->[i][j]!=goal[i][j]&&Node->[i][j]!=0) w++; } } returnw;}intpick(LNode*Node){ intw=0,i,j,ii,jj; for(i=0;i<N;i++){ for(j=0;j<N;j++){ if(Node->[i][j]!=goal[i][j]&&Node->[i][j]!=0){ for(ii=0;ii<N;ii++) for(jj=0;jj<N;jj++) if(Node->[i][j]==goal[ii][jj]){ w=w+abs(ii-i)+abs(jj-j); break; } } } } returnw;}LNode*extend(LNode*Node,intdepth,intzero[2],intmoveflag,intChoose){ LNode*NewNode=newLNode; for(inti=0;i<N;i++){ for(intj=0;j<N;j++){ NewNode->[i][j]=Node->[i][j]; } } switch(moveflag) { case1: //向左移,不能出界:zero[1]>=2 NewNode->boar