人工智能九宫格(存在一些问题)C语言
代码: #include “stdafx.h“ #include “malloc.h“ # define N 15 typedef struct Jiedian{ int a[3][3];//当前八数码阵列 }*Jie; struct Open{ Jie Op;//当前节点 typedef int fa;//在 closed 中父节点下标 int h;//此行表格是否为空 0 为空,1 为满; int x;//启发函数 h(x)的值 int m,n;//结点的空格所在坐标下标,m,n 分别为横,纵坐标 int grade;//执行优先级别,为 1 时优先级高。 }OPEN[N]; struct Closed{ int h;//父节点下标 typedef Jie Jc;//当前节点的指针 int son;//父节点的指针 }CLOSED[5000]; int Ha(int c[3][3],int d[3][3])//定义启发函数 d[][]为目标数组 { int i,j,h=0; for(i=0;i=0);//(!equal(CLOSED[h].Jc-a,b)); h=0; printf(“路径如下\n“); printa(CLOSED[h].Jc-a); while(h!=cl){ h=CLOSED[h].son; printa(CLOSED[h].Jc-a); } printf(“路径如上\n“);return 1; }//沿着父点节找到初始节点;然后输出,并 return //下面实现结点扩展 m=OPEN[j].m; n=OPEN[j].n; if(OPEN[j].ma[i1][j1];//将 open 表矩阵 赋给 p2 进行变换 p2-a[m][n]=p2-a[m+1][n]; p2-a[m+1][n]=0; //printa(p2-a); do{ //d=CLOSED[cl].h; if(equal(CLOSED[d].Jc-a,p2-a))//1 { p2=NULL; break; } d=CLOSED[d].h; }while(d=0); if(p2!=NULL) for(i1=0;i1a,b);//计算启发函数值 OPEN[i1].Op=p2; OPEN[i1].m=m+1; OPEN[i1].n=n; OPEN[i1].fa=cl; OPEN[i1].h=1; OPEN[i1].grade=0;//初始等级低 break; } } }//下移结束 // if(OPEN[j].m=1){//此节点矩阵空格可以向上移动 p2=NULL; p2=(Jie)malloc(sizeof(struct Jiedian)); d=cl; for(i1=0;i1a[i1][j1]; p2-a[m][n]=p2-a[m-1][n];//将 0 上边的值与 0 互换 p2-a[m-1][n]=0; //printa(p2-a); do{ if(equal(CLOSED[d].Jc-a,p2-a)){ //delete p2; p2=NULL; break; } d=CLOSED[d].h; }while(d=0); if(p2!=NULL) for(i1=0;i1a,b);//计算启发函数值 OPEN[i1].Op=p2; OPEN[i1].m=m-1; OPEN[i1].n=n; OPEN[i1].fa=cl; OPEN[i1].h=1; OPEN[i1].grade=0;//初始等级低 break; } } }//上移结束 // p2=(Jie)malloc(sizeof(struct Jiedian)); if(OPEN[j].n=1){//此节点矩阵空格可以向左移动 //m=OPEN[j].m; //n=OPEN[j].n; d=cl; for(i1=0;i1a[i1][j1]; p2-a[m][n]=p2-a[m][n-1];//将 0 左边的值与 0 互换 p2-a[m][n-1]=0; //printa(p2-a); do{ if(equal(CLOSED[d].Jc-a,p2-a)){ p2=NULL; break; } d=CLOSED[d].h; }while(d=0); if(p2!=NULL) for(i1=0;i1a,b);//计算启发函数值 OPEN[i1].Op=p2; OPEN[i1].m=m; OPEN[i1].n=n-1; OPEN[i1].fa=cl; OPEN[i1].h=1;//状态满 OPEN[i1].grade=0;//初始等级低 break; } } }//左移结束 // p2=(Jie)malloc(sizeof(struct Jiedian)); if(OPEN[j].na[i1][j1]; p2-a[m][n]=p2-a[m][n+1];//将 0 右边的值与 0 互换 p2-a[m][n+1]=0; //printa(p2-a); do{ if(equal(CLOSED[d].Jc-a,p2-a)){ p2=NULL; break; } d=CLOSED[d].h; }while(d=0); if(p2!=NULL) for(i1=0;i1a,b);//计算启发函数值 OPEN[i1].Op=p2; OPEN[i1].m=m; OPEN[i1].n=n+1; OPEN[i1].fa=cl; OPEN[i1].h=1; OPEN[i1].grade=0;//初始等级低 break; } } }//右移结束 // cl++; if(cl4999){ printf(“无法到达\n“); return 0; } }//if(OPEN[j].grade==1) } { min=9; for(j1=0;j1N;j1++) if(OPEN[j1].h==1) if(OPEN[j1].xmin){//找到最小代价结点 min=OPEN[j1].x; } //??对给出数列无法使 grade 为 1; for(j1=0;j1N;j1++)//给最小结点提高优先级 if(OPEN[j1].h==1){ if(OPEN[j1].x==min) OPEN[j1].grade=1;// } } for(gog=0,js=0;jsN;js++) if(OPEN[js].h==0) gog++;//break;printf(“%d“,gog); }while(gogN); } int main(int argc, char* argv[]) { int a[3][3];// int b[3][3];// int i,j; printf(“请输入八个数码顺序空的地方一零代替\n“); for(i=0;i3;i++) for(j=0;j3;j++) { //*a[i][j]=3*i+j; //printf(“请输入 a[%d]j[%d]=“,i,j); scanf(“%d“, } printf(“请输入八个数码最终结果模版,空的地方用零代替\n“); for(i=0;i3;i++) for(j=0;j3;j++) { scanf(“%d“, } qifa(a,