代码如下: From [Artificial Intelligence: A System Approach] /* 用启发式算法——A*搜索来解决八数码问题 */ #include <stdio.h> #define MAX_BOARD 3*3 #define MAX_DEPTH 22 typedef struct BroadNode { int array[MAX_BOARD]; int g; int h; int f; int depth; struct BroadNode *parent; }BNode, *BiNode; /*估计函数h(n)的计算,等于错置的图块数*/ int evaluateBoard(BiNode T) { int i, score; const int test[MAX_BOARD-1]={1,2,3,4,5,6,7,8}; score = 0; for(i=0; i<MAX_BOARD-1; i++) score += (T->array[i] != test[i]); return score; } /*A*搜索,解决八数码问题*/ void astarEightNumber() { int i; BiNode cur_board_p, child_p, temp; while(listEmpty(&openList_p)==false) { /*从OPEN优先队列中,选取第一个,即f(n)最小的结点*/ cur_board_p = getListBest(&openList_p); putList(&closedList_p, cur_board_p); if(cur_board_p->h == 0) /*h(n)==0,则表示找到了目标结点*/ { /*输出路径过程,即从初始结点到目标结点路径上的每个结点*/ showSolution(cur_board_p); return; }else{ /*由于平均22步,就应该能找到解,故h(n)>22,则放弃该结点,继续查看其他的*/ if(cur_board_p->depth > MAX_DEPTH) continue; /*列举从当前状态(结点)出发,所有可能的移动(子结点),最多4种移法*/ for(i=0; i<4; i++) { /*找到下一个子结点*/ child_p = getChildBoard(cur_board_p, i); if(child_p == (BiNode)0) continue; /*如果child_p在CLOSED表中,则抛弃child_p,继续循环*/ if(onList(&closedList_p, child_p->array, NULL)){ nodeFree(child_p); continue; } child_p->depth = cur_board_p->depth+1; child_p->h = evaluateBoard(child_p); child_p->g = child_p->depth; child_p->f = child_p->h + child_p->g; /*如果child_p在OPEN表上,则*/ if(onList(&openList_p, child_p->array, NULL)) { temp = getList(&openLisy_p, child_p->array); if(temp->f < child_p->f) { nodeFree(child_p); putList(&openList_p, temp); continue; } nodeFree(temp); child_p->parent = cur_board_p; putList(&openList_p, child_p); }else { /*child_p既不在CLOSED表上,也不在OPEN表上,则将其插入OPEN表即可*/ child_p->parent = cur_board_p; putList(&openList_p, child_p); } } } }; }