九宫格问题c语言算法,人工智能 九宫格(存在一些问题)C语言.doc

代码:

#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<3;i++)

for(j=0;j<3;j++)

if(c[i][j]!=d[i][j])

h++;

return h;

}

bool equal(int a[][3],int b[][3]){//判断两矩阵是否相等

int i,j;

for(i=0;i<3;i++)

for(j=0;j<3;j++)

if(a[i][j]!=b[i][j])

return false;

return true;

}

void printa(int a[][3]){

int i,j;

for(i=0;i<3;i++){

for(j=0;j<3;j++)

printf("%3d",a[i][j]);

printf("\n\n");

}

printf("********、\n");

}

int qifa(int a[][3],int b[][3]){//定义启发式搜索,a为初始态,b为目标态

int i,j,h=0,m,n,i1,j1,d;

int gog=0;

int js=0;//标记open空

for(i=0;i

OPEN[i].h=0;//设置open表中所有元素都标记为空

int cl=0;//定义closed表下标

int min=9;//设置一个初始最小值让它为最大代价。

Jie p1,p2;//定义节点指针

p1=(Jie)malloc(sizeof(struct Jiedian));

for(i=0;i<3;i++)

for(j=0;j<3;j++)

{

p1->a[i][j]=a[i][j];

if(a[i][j]==0){

m=i;n=j;

}

}

OPEN[0].Op=p1;//把节点放入open表中

OPEN[0].h=1;//状态满

OPEN[0].fa=-1;//无父节点

OPEN[0].grade=1;//开始扩展

OPEN[0].m=m;//0位置

OPEN[0].n=n;

do{js=0;

for(i=0;i

if(OPEN[i].h==0)

js++;//

}

if(js==N){printf("meiyou");return 0;}//open表为空

for(j=0;j

if(OPEN[j].grade==1){//找到估价最小的的结点

CLOSED[cl].Jc=OPEN[j].Op;//将open表节点放入closed表中

CLOSED[cl].h=OPEN[j].fa;//父节点编号给closed结点

OPEN[j].h=0;//标记为空

if(equal(CLOSED[cl].Jc->a,b))//找到目标结点//2

{

h=CLOSED[cl].h;

js=cl;

do{//输出倒叙路径

CLOSED[h].son=js;

js=h;

h=CLOSED[h].h;

}while(h>=0);//(!equal(CLOSED[h].Jc->a,b));

h=0;

printf("路径如下\n");

printa(CLOSED[h].Jc->a);

while(h!=cl){

h=CLOSED[h].son;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值