1、由文件 input.txt 给出输入数据。文件的第 1 行有 1 个正整数 n。以下的 n 行是 nn 方格阵列的中数字 1n2-1 的初始排列,每行有 n 个数字表示该行方格中的数字, 0 表示空格。结果输出:将计算出的最少移动次数和相应的移动序列输出到文件 output.txt。第 1 行是最少移动次数。从第 2 行开始,依次输出移动序列。三、源程序关键代码#includemalloc.hstdlib.h#define Overflow 1#define N 3int goalNN=1,2,3,8,0,4,7,6,5;int zero2,NodeQTY=0;int *z=zero;/记录0
2、的位置,zero0:r行;zero1:c列 typedef int Piece;struct Chessboard/棋盘信息 Piece posNN;/记录每个数码a的位置r行c列 int d,f,move;/d:深度;f:启发函数值 ;move:父节点移动到该节点的方式 ;struct LNode Chessboard board; LNode *parent,*next; bool flag;typedef LNode* List;int* Findzero(LNode* &Node) int i,j,zr2; int *z=zr; for(i=0;iN;i+) for(j=0;jboar
3、d.posij=0) zr0=i+1; zr1=j+1; break; return z;int Wrong(LNode *Node) int w=0,i,j;board.posij!=goalij&Node-=0) w+; return w;int pick(LNode *Node) int w=0,i,j,ii,jj;=0) for(ii=0;iiii+) for(jj=0;jjboard.posij=goaliijj) w=w+abs(ii-i)+abs(jj-j); break; LNode* extend(LNode *Node,int depth,int zero2,int mov
4、eflag,int Choose) LNode* NewNode=new LNode; for(int i=0; for(int j=0; NewNode-board.posij=Node-board.posij; switch(moveflag) case 1: /向左移,不能出界:zero1=2 NewNode-board.poszero0-1zero1-1=NewNode-board.poszero0-1zero1-2;board.poszero0-1zero1-2=0; case 2: /向右移,不能出界:zero1board.poszero0-2zero1-1;board.posze
5、ro0-2zero1-1=0; case 4: /向下移,不能出界:zero0board.d=depth+1; switch(Choose)NewNode-board.f=NewNode-board.d+Wrong(NewNode);break;board.d+pick(NewNode); board.move=moveflag;parent=Node; NodeQTY+; return NewNode;void InitList(LNode* &Open,LNode* &Close) Open=(List)malloc(sizeof(LNode); Close=(List)malloc(si
6、zeof(LNode); if(!Open&! exit(Overflow); Open-next=NULL; Close-int ListInsert(List &L,LNode* NewNode) List p=L; while(p-next) p=p-next;next=p- p-next=NewNode; return true;LNode* Getminf(List &L) List p=L,q=L-next,r=L,min; min=q;/p,q寻找f最小值的指针,r指向表L中min前一个元素 q) return NULL; while(q) if(min-board.fq-boa
7、rd.f) r=p; min=q; p=q; q=q- r-next=min- min- return min;int main() int i,j,choose; List Open,Close; LNode *Best,*current; LNode *Start=new LNode; printf(ttt八 数 码 问 题 求 解n);n请输入初始状态: scanf(%d,&(Start-board.posij);(注:The flag of movement-1:左移;2:右移;3:上移;4:下移)n初始棋盘状态:n printf(|%d,Start-board.posij); pri
8、ntf(|n InitList(Open,Close);请选择(1:A算法;A*算法): scanf(choose); Start-board.d=0; switch(choose)Start-board.f=Start-board.d+Wrong(Start);board.d+pick(Start); / Start-board.f=0+Wrong(Start); Start-board.move=0;parent=NULL;flag=1; ListInsert(Open,Start);/将S加入到Open表中 while(Open- Best=Getminf(Open); ListInsert(Close,Best); if(!(Best-board.f-Best-board.d)$*有解!*$n break; z=Findzero(Best); zero0=*(z+0);zero1=*(z+1); if(zero1=N-1&Best-board.move!=2) ListInsert(Open,extend(Best,Best-board.d,zero,1,choose); if(zero1=1) ListInsert(Open,extend(Be
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1