下载此文档

启发式搜索 八数码问题.docx


文档分类:论文 | 页数:约11页 举报非法文档有奖
1/11
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/11 下载此文档
文档列表 文档介绍
启发式搜索
介绍
八数码问题也称为九宫问题。在3X3的棋盘,摆有八个棋子,每个棋子上标有1至8 的某一数字,不同棋子上标的数字不相同。棋盘上还有一个空格(以数字0来表示), 与空格相邻的棋子可以移到空格中。
要求解决的问题是:给出一个;
}
〃计算启发值的函数
int calvalue(int a[]) 〃不在位棋子数
{
int c = 0;
for (int i = 0;i <= 8;i++)
if (a[i] != goal[i])
if (goal[i] != 0)
c++;
return c;
}
〃生成一个新节点的函数
NodeLink *newnode(NodeLink *TEM, int depth, int flag)
{
NodeLink *temp = new NodeLink;
for (int i = 0;i <= 8;i++)
temp->[i] = TEM->[i];
switch (flag)
{
case 1:
{
temp->[0]--;
temp->[sgoal[temp->[0]]]++; 〃向左移
break;
}
case 2:
{
temp->[0]++;
temp->[sgoal[temp->[0]]]--; //向右移
break;
}
case 3:
{
temp->[0] -= 3;
temp->[sgoal[temp->[0]]] += 3; 〃向上移
break;
}
case 4:
{
temp->[0] += 3;
temp->[sgoal[temp->[0]]] -= 3; //向下移
break;
}
}
temp-> = depth + 1;
setboard(sgoal, temp->, 1);
temp-> = temp-> + calvalue(sgoal);
temp-> = flag;
temp->parent = TEM;
return temp;
}
//把新节点加入OPEN队列
NodeLink *addnode(NodeLink *head, NodeLink *node) 〃把 node 插入到 head 链中
{
NodeLink *TEM;
TEM = head;
head = node;
head->next = TEM;
head->previous = NULL;
if (TEM)
TEM->previous = head; //TEM 已为空,无需操作
return head;
}
90.
〃求启发值最小的结点
NodeLink *minf(NodeLink *head)
{
NodeLink *min, *forward;
min = head;
forward = head;
while (forward)
{
if (min->>forward->)
min = forward;
forward = forward->next;
}
return min;
}
105.
int main()
{
int depth = 0;
int source[9];
int i, j;
111.
NodeLink *OPEN = new NodeLink;
NodeLink *TEMP, *TEM;
114.
printf("请输入初始状态:\n");
for (i = 0;i<9;i++)
scanf_s("%d”, &source[i]);
118.
setboard(source, OPEN->, 0);
OPEN-> = depth;
OPEN-> = 0;
OPEN-> = depth + calvalue(source);
OPEN->next = NULL;
OPEN->previous = NULL;
OPEN->parent = NULL;
126

启发式搜索 八数码问题 来自淘豆网m.daumloan.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数11
  • 收藏数0 收藏
  • 顶次数0
  • 上传人shugezhang1
  • 文件大小33 KB
  • 时间2022-06-20
最近更新