




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
八数码问题实验报告一、 实验要求:九宫重排问题: 在33的井子九宫格棋盘上摆有8个牌,分别标有1-8个数码。棋盘上尚有一个空格,允许其周围的将牌向空格移动。这个通过移动将牌就可以变换将牌布局。现给定如下两种布局,一种为初始状态,一种为目标状态,问如何移动将牌,以将初始状态变换为目标状态?二、 实验思路:A*算法取g(n)=d(n),h(n)=w(n),其中w(n)表示以目标为基准,结点n的状态中不在位将牌的个数。由于从结点n转换成目标结点至少需要w(n)步,所以对任意n,恒有w(n) h*(n)。三、 实验代码:#include#include#include#include#include#define size 3long total;typedef char boardsizesize;board target = 1,2,3,8,0,4,7,6,5;/ 目标状态class Nodepublic:board data;/存放状态Node *parent;/存放父节点地址Node *child4;/存放子节点地址,最多个Node *next;int f,h,g,how;/how中记录了其父节点如何移动生成该节点Node();int geth();Node:Node()/构造函数parent=NULL;next=NULL;for(int i=0;i4;i+)childi=NULL;h=0;g=0;how=0;f=0;int Node:geth()/计算h值(h值为每个将牌与其目标位的总和)int h=0;for(int i=0;isize;i+)for(int j=0;jsize;j+)for(int x=0;xsize;x+)for(int y=0;ydataij&targetxy!=0)h+=abs(x-i)+abs(y-j);return h;/*/bool can_solve(Node *start) / 搜索前判断是否可解long i,j,k1,k2;for (i=0; isize; i+) for (j=0; jdataij=0) start-dataij = size*size;k1 = (size-1-i) + (size-1-j);if(targetij=0)targetij = size*size;k2 = (size-1-i) + (size-1-j);for (i=0; isize*size; i+) for (j=i+1; jdatai/sizei%size start-dataj/sizej%size) k1+;if (targeti/sizei%size targetj/sizej%size) k2+;for (i=0; isize; i+) for (j=0; jdataij=size*size) start-dataij=0;if (targetij=size*size) targetij=0;return (k1%2)=(k2%2);Node *head;/判断temp状态是否是目标状态bool goal(board temp)for(int i=0;isize;i+)for(int j=0;jsize;j+)if(tempij!=targetij)return false;return true;/返回所在的坐标void getxy(Node *temp,int &x,int &y)for(int i=0;isize;i+)for(int j=0;jdataij=0)x=i;y=j;/扩展p所指向的节点void Expand(Node *p)int x,y;getxy(p,x,y);int i=0;/y!=0(左边有节点)并且how!=4(不是父节点右移得到的),进行左移if(y!=0&p-how!=4)p-childi=new Node;for(int k=0;ksize;k+)for(int j=0;jchildi-datakj=p-datakj;p-childi-dataxy=p-dataxy-1;p-childi-dataxy-1=0;p-childi-parent=p;p-childi-h=p-childi-geth();p-childi-g=p-g+1;p-childi-how=1;p-childi-f=p-childi-h+p-childi-g;i+;total+;if(y!=2&p-how!=1)p-childi=new Node;for(int k=0;ksize;k+)for(int j=0;jchildi-datakj=p-datakj;p-childi-dataxy=p-dataxy+1;p-childi-dataxy+1=0;p-childi-parent=p;p-childi-h=p-childi-geth();p-childi-g=p-g+1;p-childi-how=4;p-childi-f=p-childi-h+p-childi-g;i+;total+;if(x!=0&p-how!=3)p-childi=new Node;for(int k=0;ksize;k+)for(int j=0;jchildi-datakj=p-datakj;p-childi-dataxy=p-datax-1y;p-childi-datax-1y=0;p-childi-parent=p;p-childi-h=p-childi-geth();p-childi-g=p-g+1;p-childi-how=2;p-childi-f=p-childi-h+p-childi-g;i+;total+;if(x!=2&p-how!=2)p-childi=new Node;for(int k=0;ksize;k+)for(int j=0;jchildi-datakj=p-datakj;p-childi-dataxy=p-datax+1y;p-childi-datax+1y=0;p-childi-parent=p;p-childi-h=p-childi-geth();p-childi-g=p-g+1;p-childi-how=3;p-childi-f=p-childi-h+p-childi-g;i+;total+;/插入open表for(int j=0;jf=p-childj-f)Node *temp=head;head=p-childj;p-childj-next=temp;elseNode *temp=head;Node *oldtemp=temp;while(temp!=NULL&temp-fchildj-f)oldtemp=temp;temp=temp-next;if(temp=NULL|oldtemp-next=NULL)oldtemp-next=p-childj;p-childj-next=NULL;elseoldtemp-next=p-childj;p-childj-next=temp;p-next=head;void main()int i,j,k;double totaltime;double fenzhi=0;double fenmu=0;int cs;char ch;/scanf(%ld, &cs);cs = 1;while (true)total=1;/输入原始状态Node begin;Node *start=&begin;srand(unsigned)time(NULL); /随机时间种子int a9;for(i=0;isize;i+)for(j=0;jdataij=k; ai*size+j=k; for(k=0;kdataij=ak) j-; break; printf(n初始状态为:n);for(int i=0;isize;i+)for(int j=0;jdataij);printf(n);printf(是否要修改目标状态?(y/n):n);scanf( %c,&ch);if(ch=Y|ch=y)printf(请输入新的目标状态:n);for (i=0;isize;i+)for(j=0;jg=0;start-h=start-geth();start-how=0;start-f=start-h+start-g;head=start;/加入open表,head为头指针while(true)if(goal(head-data)break;/将tempn(原来的head)从open表中删除Node *tempn=head;head=head-next;/扩展tempnExpand(tempn);fenmu=fenmu+1;/对open表进行排序i=0;fenzhi=fenzhi+1;while(tempn-childi!=NULL&i4)i+;fenzhi=fenzhi+1;printf(n%2.10f ,totaltime);totaltime=(double(clock()-totaltime)/CLOCKS_PER_SEC;printf(n%2.10f n,double(clock();fenzhi=fenzhi/fenmu;j=-1;/输出结果while(head!=NULL)for(int i=0;isize;i+)for(int j=0;jdataij);printf(n);head=head-parent;printf( n);j+;printf(总共%d步!n,j);printf( 运行时间: %2.8f seconds
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度管道顶进施工安全监理与风险管理合同
- 2025版事业单位经济合同合同标的合同履行效益评估与考核
- 2025导游劳动合同范本:含旅游目的地文化传承责任的导游服务合同
- 2025年车载泵租赁与水利工程应用合同范本
- 2025年车辆安全检测与维修服务合同
- 2025年多功能吊车租赁项目合同模板
- 2025房地产定向开发项目合作投资协议
- 2025年度残障人士就业支持项目定向捐赠三方协议
- 2025版汽车修理厂土地租赁及汽车维修服务质量认证合同
- 2025年二手房交易附加装修合同
- 高一英语练字字帖
- 《SPC统计过程控制》课件
- GB/T 40073-2021潜水器金属耐压壳外压强度试验方法
- GB/T 3624-2010钛及钛合金无缝管
- GB/T 14153-1993硬质塑料落锤冲击试验方法通则
- (完整版)人教版八年级下册《道德与法治》期末测试卷及答案【新版】
- 维护新疆稳定 实现长治久安课件
- 北京大学人民医院-医疗知情同意书汇编
- 档案管理员述职报告9篇
- 舞台灯光基础知识教学课件
- 牙体牙髓病最全课件
评论
0/150
提交评论