《算法程序范例集》(11)九宫问题.docVIP

《算法程序范例集》(11)九宫问题.doc

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

九宫问题

?

题目叙述:九宫问题又称“八数码问题”,是说在3×3的方格棋盘上,摆放着1到8这八个数码,有1个方格是空的,从某种初始状态开始,对空格执行空格左移、空格右移、空格上移和空格下移这四个操作使得棋盘从初始状态变换至目标状态。求其最少步数。

?

?

/*****************************/

/*EIGHTDIGITPROBLEM*/

/*唐国峰2012年4月23日*/

/*****************************/

?

//预编译命令

#includeiostream

#includestdlib.h

usingnamespacestd;

?

//棋盘大小

#definesize3

?

//定义二维数组来存储数据表示某一个特定状态

typedefintstatus[size][size];

?

//定义状态图中的节点数据结构,即节点的状态信息等

typedefstructNode

{

statusdata; //节点所存储的状态

structNode*parent; //指向节点的父亲节点

structSpringLink*child; //指向节点的后继节点

structNode*next; //指向链表的后一个节点

intf_value; //由初始状态经由当前节点至目标状态的总耗散值

intg_value; //由初始状态经到当前节点实际耗散值

inth_value; //由当前节点到目标状态的预计耗散值

}NNode,*PNode;

?

?

//定义表述指向当前节点的扩展节点的链表

typedefstructSpringLink

{

structNode*pointData; //指向节点的指针

structSpringLink*next; //指向当前节点的其他扩展节点

}SPLink,*PSPLink;

?

//声明OPEN表和CLOSED表

PNodeopen;

PNodeclosed;

?

//计算棋盘状态的逆序数

intInverseNumber(statusa)

{

inti,j,sum=0;

intdata_chang[size*size]={0};

?

//将二维数组转换成一维数组,以方便求逆序数

for(i=0;isize;i++)

{

for(j=0;jsize;j++)

{

data_chang[i*size+j]=a[i][j];

}

}

?

?

//计算序列中除零外的逆序数

for(i=0;i=size*size;i++)

{

if(data_chang[i]!=0)

{

//要比较多少次,从最后一个元素开始比较

for(j=i;j=0;j--)

{

//当后一个数比前一个数小时

if(data_chang[i]data_chang[j])

{

sum++;

}

}

}

}

returnsum;

}

?

//判断是否存在解决方案

boolhasSolution(statusstartStatus,statustargetStatus)

{

intstartInverseNumber=InverseNumber(startStatus);

inttatgetInverseNumber=InverseNumber(targetStatus);

?

//判断初始状态和目标状态除零外的序列逆序数奇偶性,相同则可求值,不同则不可求

if((startInverseNumber%2)!=(tatgetInverseNumber%2))

{

returnfalse;

}

else

{

returntrue;

}

}

?

?

//初始化一个空链表

voidinitLink(PNodeHead)

{

Head=(PNode)malloc(sizeof(NNode));

Head-next=NULL;

}

?

?

//判断链表是否为空

boolisEmpty(PNodeHead)

{

if(Head-next==NULL)

{

returntrue;

}

else

{

returnfalse;

}

}

?

?

//从链表中拿出一个数据

voidpopNode(PNodeHead,PNodeFNode)

{

if(isEmpty(Head))

{

F

文档评论(0)

不倒霉的每一天 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档