版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
八数码问题实验报告一、实验目的二、实验内容九宫格中有8个数码,其中只有一个空,规则是只能把一个数码移动到空的格子中,要求从一个初始状态移动到一个目标状态所要花费的最少步数【算法分析】【具体步骤】四、代码和结果^defineCRTSECURENOWARNINGS#include"stdlib.h"#include,zstdio.h〃typedefstructNode{intnum[9];〃棋盘状态intdeepth;〃派生的深度g(n)intdiffnum;〃不在位的数目h(n)intvalue;//耗散值f(n)=g(n)+h(n)structNode*pre;structNode*next;p2->parent=pl;p2->deepth=pl->deepth+1;p2->diffnum=diff(p2->num);p2->value=p2->deepth+p2->diffnum;if(p2->diffnum二二0)(total_step=printresult(p2);printfC一共需要:步\n〃,totalstep);free_list(open);free_list(close);return1;)else(numNodenum++;open_insert(open,p2);})elsefree(p2);return0;}intoperate(intm[],intop)(intblank;blank=0;while(m[blank]!=0&&blank<9)++blank;if(blank==9)return1;switch(op){/*up*/if(blank>2)swap(m+blank,m+blank-3);break;/*down*/if(blank<6)swap(m+blank,m+blank+3);
break;/*left*/if(blank!=0&&blank!=3&&blank!=6)swap(m+blank,m+blank-1);break;/*right*/if(blank!=2&&blank!=5&&blank!=8)swap(m+blank,m+blank+1);break;default:return1;)return0;}voidswap(int*a,int*b)(intc;c二*a;*a二*b;*b二c;}numNode*copy_numNode(numNode*chu_shi_zhuang_tai){numNode*p;p=createnumNode(;p->deepth=chu_shi_zhuang_tai->deepth;p->diffnum=chu_shi_zhuang_tai->diffnum;p->value=chu_shi_zhuang_tai->value;inti;for(i=0;i<9;i++)((p->num)[i]=(chu_shi_zhuang_tai->num)[i];)returnp;)intdiff(intnum[9])(inti,diffnum=0;for(i=0;i<9;i++)if(num[i]!=mu_biao_zhuang_tai[i])diffnum++;returndiffnum;}charisNewNode(numNode*open,numNode*close,intnum[91)numNode*p;inti=0;p=open->next;while(p!=NULL)(for(i=0;i<9;i++)(if(p->num[i]!=num[i])break;)if(i=9)return'O';//Openp=p->next;)p二close->next;while(p!=NULL)for(i=0;i<9;i++)if(p->num[i]!=num[i])break;)if(i==9)return'C';//Closep=p->next;)return'N';}voidfree_list(numNode*head){numNode*p,*q;p=head->next;while(p!=NULL){q=p->next;free(p);free(head);voidprint_num(intnum[9])(inti;for(i=0;i<9;i++)(printfnum[i]);if((i%3)=二2)printf(〃\n〃);)}intprintresult(numNode*item)(numNode*p;intstep;p=item;if(p!=NULL)step=print_result(p->parent);printf("\n第%d步:\n〃,step+1);printnum(p->num);returnstep+1;)else(return-1;}ostructNode*parent;}numNode;〃棋盘初始状态intchushizhuangtai[9];〃棋盘目标状态intmu_biao_zhuang_tai[9];intnumNodenum,total_step;numNode*open,*close;numNode*create_numNode((return(numNode*)malloc(sizeof(numNode));)〃返回第一项,并从Open表中删除numNode*opengetfirst(numNode*head);〃向Open表中按序插入新节点voidopen_insert(numNode*head,numNode*item);〃向Close表中插入新节点voidcloseappend(numNode*head,numNode*item);intexpand(numNode*item);〃扩展节点intprint_result(numNode*item);//打印结果numNode*copy_numNode(numNode*orgin);〃是否在Open表或Close表中charisNewNode(numNode*open,numNode*close,intnum[9]);voidprint_num(intnum[9]);〃打印棋盘状态intdiff(intnum[9]);//求不在位棋子的个数〃初始化,获得棋盘初始状态和目标状态voidinit(;voidswap(int*a,int*b);intoperate(intnum[],intop);voidfreelist(numNode*head);voidopen_insert(numNode*head,numNode*item);voidclose_append(numNode*head,numNode*item);intexpand(numNode*pl);〃程序入口intmain(intargc,char*argv[])(〃初始化Open表和Close表open=create_numNode(;close=createnumNode(;〃由用户输入初始和目标状态open->pre=open->next=close->pre=close->next=NULL;init(;〃初始化初始节点numNode*pl;pl二createnumNode(;pl->parent=NULL;pl->deepth=0;inti=0;for(i=0;i<9;i++)(pl->num[i]=chushizhuangtai[i];)open_insert(open,pl);numNodenum=1;pl二opengetfirst(open);while(pl!=NULL)closeappend(close,pl);if(expand(pl))returnEXIT_SUCCESS;pl=opengetfirst(open);)printf(,zNosolution!\n,z);returnEXIT_SUCCESS;}/*主函数部分*/〃子函数voidinit((while(1)Iprintf(〃规定123456780代表状态\n〃〃123\n〃〃456\n〃"780\n〃);printf(〃请输入初始状态(数字之间无空格)\n〃);chartemp[10];scanf(〃%s〃,&temp);inti=0;for(i=0;i<9&&temp[i]-'O'>=0&&temp[i]-O'<=8;i++){chu_shi_zhuang_tai[i]=temp[i]-'O';)printf(〃\n〃);printf(〃请输入目标状态(格式同上):\n〃);scanf(〃%s〃,fetemp);intj=0;for(j=0;j<9&&temp[j]一'O'>=0&&temp[j]-0,<=8;j++)(mu_biao_zhuang_tai[j]=temptj]-'O';)printf(〃\n〃);system(〃cls〃);if(i==9&&j==9)break;)}voidopen_insert(numNode*head,numNode*item)(numNode*p,*q;p=head->next;q=head;while(p!=NULL&&item->value>p->value){q二P;p=p->next;)q->next=item;item->pre=q;item->next=p;if(p!=NULL)p->pre=item;numNode*open_getfirst(numNodc*head)(numNode*p;if(head->next==NULL)(returnNULL;)p=head->next;head->next=p->next;if(p->next!=NULL)Ip->next->pre=head;)p->pre=NULL;p->next=NULL;returnp;voidcloseappend(numNode*head,numNode*item){item->next=head->ne
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第32讲锐角三角函数及其应用(讲义)(原卷版)
- 624届二模化学试题答案
- 2019年高考历史人民版一轮复习练案7辛亥革命
- 高中英语人教版必修3Unit4Astronomythescienceofthestarsperiod5测试(学生版)
- 安全教育主题班会教案
- MTP管理培训闫高峰老师-20211101100801
- 2023-2024学年全国小学四年级上英语人教版期中试卷(含答案解析)
- 第1章-非平衡态热力学4
- 2024年沈阳经营性道路旅客运输驾驶员从业资格考试题库
- 2024年酒店会务合同协议书
- 中国的时尚与时尚产业
- 炊事基础理论知识
- 颅内占位性的病变护理查房课件
- 山东省烟台市芝罘区(五四制)2023-2024学年九年级上学期期末考试物理试题
- 女职工权益维护知识讲座
- DB14∕T 1851-2019 中华鼢鼠防治技术规程
- 2024年风电铸件行业市场研究报告
- 初中英语教学中的情景教学方法
- 中耳胆脂瘤的护理查房
- 高空作业安全防护措施与操作规程
- 财务科廉洁风险点及防控措施【15篇】
评论
0/150
提交评论