




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上把数码问题就是把一串数字变成下面这个样子:1 2 38 0 4 7 6 5实现方法1.过程表示源代码:#include<stdio.h>static int style9=1,2,3,6,7,4,5,8,0;/输入的数码/2,5,4,3,0,7,1,8,6 3,2,1,8,0,4,7,6,5 1,0,4,2,7,3,8,5,6 1,0,3,8,2,4,7,6,5static int arrayStep416=5,4,3,6,7,8;/第四步和第六步共用的数组,所以设为全局量static int arrayStep714=3,6,7,4;static int
2、 local;/空格的位置int i,j;/所用到的变量int number=0;/记录移动步数void print();void step1();void step2();void step3();void step4();void step5();void step6();void step7();void step8();void step9();void exchange(int x,int y);void judge();void judge()/判断空格位置number = 0;for(i=0;i<9;i+)if(stylei=0)local=i;return;void ex
3、change(int x,int y)/交换两个数int temp;print();temp=stylex;stylex=styley;styley=temp;local=y;number+;void step1()int arrayStep115=3,0,1,2,5;int arrayStep126=6,7,8,5,2,1;if(style2!=0)&&style2!=1)return;elseif(local=2)if(style1=1)exchange(2,5);elseexchange(2,1);return;elseif(local=4)exchange(4,1);i
4、=2;while(local!=5)exchange(arrayStep11i,arrayStep11i+1);i+;return;for(i=0;i<3;i+)if(arrayStep11i=local)while(local!=5)exchange(arrayStep11i,arrayStep11i+1);i+;return;for(i=0;i<4;i+)if(arrayStep12i=local)while(local!=1)exchange(arrayStep12i,arrayStep12i+1);i+;return;return;void step2()int array
5、Step218=0,3,6,7,8,5,4,1;for(i=0;i<8;i+)if(arrayStep21i=local)while(style0!=1)exchange(arrayStep21i%8,arrayStep21(i+1)%8);i+;break;void step3()int arrayStep318=2,1,4,3,6,7,8,5;for(i=0;i<8;i+)if(arrayStep31i=local)while(style1!=2)exchange(arrayStep31i%8,arrayStep31(i+1)%8);i+;break;void step4()f
6、or(i=0;i<6;i+)if(arrayStep41i=local)while(style4!=3)exchange(arrayStep41i%6,arrayStep41(i+1)%6);i=(i+1)%6;while(local!=3)exchange(arrayStep41i%6,arrayStep41(i+5)%6);i=(i+5)%6;break;void step5()int arrayStep519=3,0,1,4,5,2,1,0,3;i=0;doexchange(arrayStep51i,arrayStep51i+1);i+;while(local!=3);void s
7、tep6()for(i=0;i<6;i+)if(arrayStep41i=local)while(style5!=4)exchange(arrayStep41i%6,arrayStep41(i+1)%6);i+;if(local=8)exchange(8,7);break;return;void step7()for(i=0;i<4;i+)if(arrayStep71i=local)while(style4!=5)exchange(arrayStep71i%4,arrayStep71(i+1)%4);i=(i+1)%4;while(local!=3)exchange(arraySt
8、ep71i%4,arrayStep71(i+3)%4);i=(i+3)%4;break;void step8()int arrayStep8113=3,0,1,2,5,4,7,8,5,2,1,0,3;i=0;doexchange(arrayStep81i,arrayStep81i+1);i+;while(local!=3);void step9()for(i=0;i<4;i+)if(arrayStep71i=local)while(style7!=6)exchange(arrayStep71i%4,arrayStep71(i+1)%4);i=(i+1)%4;while(local!=4)
9、exchange(arrayStep71i%4,arrayStep71(i+3)%4);i=(i+3)%4;break;void print()for(j=0;j<9;j+)if(stylej=0)printf(" t");elseprintf("%dt",stylej);if(j+1)%3=0)printf("n");printf("* %d *n",number);void loop()printf("请输入数码:n");for(i=0;i<9;i+)scanf("%d
10、",&stylei);judge();step1();step2();step3();if(style2!=3)step4();step5();step6();if(style8!=5)step7();step8();step9();print();if(!(style3=8)&&(style6=7)printf("用书上所给算法来看此数码错误!n");void main()while(1)loop();2. 深度优先实现/*说明* 用宽度优先搜索算法实现八数码问题 */#include<iostream>#include<
11、;stdio.h>#include<fstream>#include<stdlib.h> #include "string.h" #include "assert.h" #include "windows.h" using namespace std;int wholeStyle9 = 2,8,3,1,6,4,7,0,5;int standard19 = 1,2,3,8,0,4,7,6,5;int local,i,j;int startKey = 0,endKey = 0,equalKey = 1,tem
12、pSpace;struct node *openHead,*open; /open表struct node *closedHead,*closed; /closed表struct node *tempNode; /临时节点struct node *answer; /找到的路径int num = 0;struct nodeint style9;struct node *next;struct node *father;void updateData() /更新要判断数据int i;printf("请输入八数码原始状态:n");for(i = 0;i < 9;i+)sca
13、nf("%d",&wholeStylei);printf("请输入八数码最终状态:n");for(i = 0;i < 9;i+)scanf("%d",&standard1i);void judge1(struct node *head)/判断空格位置for(i = 0;i < 9;i+)if(head->stylei = 0)local = i;return;int judge2(struct node *head) /判断是否与标准八数码相等,不相等返回值为0for(i = 0;i < 9;i
14、+)if(head->stylei != standard1i)if(i = 3)&&(head->style3 = standard16);else if(i = 6)&&(head->style6 = standard13);else return 0;return 1;void judge3() /判断新生成的八数码是否就是最终状态或者在open、closed表中出现if(judge2(tempNode)endKey = 1;elsewhile(openHead->next->next->style0 != 9)for(
15、i = 0;i < 9;i+)if(openHead->next->next->stylei != tempNode->stylei)equalKey = 1;break;elseequalKey = 0;if(equalKey)/不相等openHead = openHead->next;elsebreak;openHead = open->next;if(equalKey)/不相等while(closedHead->next->style0 != 9)for(i = 0;i < 9;i+)if(closedHead->next
16、->stylei != tempNode->stylei)equalKey = 1;break;elseequalKey = 0;if(!equalKey)/相等break;elseclosedHead = closedHead->next;closedHead = closed->next;if(equalKey)/不相等open->next = tempNode;tempNode->next = openHead;tempNode->father = openHead->next;open = open->next;void print
17、(struct node *temp) /输出八数码表for(j = 0;j < 9;j+)if(temp->stylej = 0)printf(" t");elseprintf("%dt",temp->stylej);if(j + 1) % 3 = 0)printf("n");void write2txt()ofstream out("F:out_details.txt",ios:app);if( out.fail() )cerr<<"未找到文件"<<
18、endl;out<<" 第"<<+num<<"步n"out<<"open table:n"while(openHead->next->style0 != 9)for(i = 0;i < 9;i +)out<<openHead->next->stylei<<"t"if(i+1) % 3 = 0)out<<"n"out<<"n"openHead = ope
19、nHead->next;openHead = openHead->next;out<<"*n"out<<"closed table:n"while(closedHead->next->style0 != 9)for(i = 0;i < 9;i +)out<<closedHead->next->stylei<<"t"if(i + 1) % 3 =0)out<<"n"out<<"n"cl
20、osedHead = closedHead->next;closedHead = closedHead->next;out<<"-n"out.close();void main()/updateData();/输入八数码数据for(i = 0;i < 9;i+) /判断初始状态是否已经为最终状态if(wholeStylei = standard1i);elseif(i = 3)&&(wholeStylei = standard16);else if(i = 6)&&(wholeStylei = standard1
21、3);else startKey = 1;break;if(!startKey)printf("不用判断!n");return;printf("要判断!n");openHead = new node();open = new node();openHead->style0 = 9;openHead->next = open;for(i = 0;i < 9;i+)open->stylei = wholeStylei;open->next = openHead;open->father = openHead;closedH
22、ead = new node();closed = new node();closedHead->style0 = 9;closedHead->next = closedHead;closed = closedHead;while(open->style0 != 9)/当open表不为空时一直循环judge1(openHead->next);if(local % 3 > 0)/右移equalKey = 1;tempNode = new node();for(i = 0;i < 9;i+)tempNode->stylei = openHead->n
23、ext->stylei;tempSpace = tempNode->stylelocal - 1;tempNode->stylelocal - 1 = tempNode->stylelocal;tempNode->stylelocal = tempSpace;judge3();if(endKey)break;if(local > 2)/下移equalKey = 1;tempNode = new node();for(i = 0;i < 9;i+)tempNode->stylei = openHead->next->stylei;tem
24、pSpace = tempNode->stylelocal - 3;tempNode->stylelocal - 3 = tempNode->stylelocal;tempNode->stylelocal = tempSpace;judge3();if(endKey)break;if(local % 3 < 2)/左移equalKey = 1;tempNode = new node();for(i = 0;i < 9;i+)tempNode->stylei = openHead->next->stylei;tempSpace = tempN
25、ode->stylelocal + 1;tempNode->stylelocal + 1 = tempNode->stylelocal;tempNode->stylelocal = tempSpace;judge3();if(endKey)break;if(local < 6)/上移equalKey = 1;tempNode = new node();/tempNode = malloc(sizeof(struct node);for(i = 0;i < 9;i+)tempNode->stylei = openHead->next->sty
26、lei;tempSpace = tempNode->stylelocal + 3;tempNode->stylelocal + 3 = tempNode->stylelocal;tempNode->stylelocal = tempSpace;judge3();if(endKey)break;closed->next = openHead->next;/把open的标头添加到closed表中openHead->next = openHead->next->next; closed = closed->next;closed->n
27、ext = closedHead;write2txt();open->next = tempNode;/把找到的新节点添加到open表中tempNode->next = openHead;tempNode->father = openHead->next;open = open->next;closed->next = openHead->next;/把open的标头添加到closed表中openHead->next = openHead->next->next; closed = closed->next;closed->
28、;next = closedHead;write2txt();answer = new node();tempNode = new node();tempNode = open;while(tempNode->style0 != 9)/将结果路径存于answeranswer = tempNode;tempNode = tempNode->father;tempNode->next = answer;num = 0;while(answer->next->style0 != 9)/输出answerprintf("*第%d步*n",num+);pr
29、int(answer);answer = answer->next;printf("n");printf("*第%d步*n",num+);print(answer);if(answer->style3 != standard13)printf("n!输入的八数码不合法,不能从初始状态到最终状态nnnn");return;3. 宽度优先:/*说明* 用宽度优先搜索算法实现八数码问题 */#include<iostream>#include<stdio.h>#include<fstream>
30、#include<stdlib.h> #include "string.h" #include "assert.h" #include "windows.h" using namespace std;int wholeStyle9 = 2,8,3,1,6,4,7,0,5;int standard19 = 1,2,3,8,0,4,7,6,5;int local,i,j;int startKey = 0,endKey = 0,equalKey = 1,tempSpace;struct node *openHead,*open;
31、 /open表struct node *closedHead,*closed; /closed表struct node *tempNode; /临时节点struct node *answer; /找到的路径int num = 0;struct nodeint style9;struct node *next;struct node *father;void updateData() /更新要判断数据int i;printf("请输入八数码原始状态:n");for(i = 0;i < 9;i+)scanf("%d",&wholeStylei)
32、;printf("请输入八数码最终状态:n");for(i = 0;i < 9;i+)scanf("%d",&standard1i);void judge1(struct node *head)/判断空格位置for(i = 0;i < 9;i+)if(head->stylei = 0)local = i;return;int judge2(struct node *head) /判断是否与标准八数码相等,不相等返回值为0for(i = 0;i < 9;i+)if(head->stylei != standard1i)
33、if(i = 3)&&(head->style3 = standard16);else if(i = 6)&&(head->style6 = standard13);else return 0;return 1;void judge3() /判断新生成的八数码是否就是最终状态或者在open、closed表中出现if(judge2(tempNode)endKey = 1;elsewhile(openHead->next->next->style0 != 9)for(i = 0;i < 9;i+)if(openHead->n
34、ext->next->stylei != tempNode->stylei)equalKey = 1;break;elseequalKey = 0;if(equalKey)/不相等openHead = openHead->next;elsebreak;openHead = open->next;if(equalKey)/不相等while(closedHead->next->style0 != 9)for(i = 0;i < 9;i+)if(closedHead->next->stylei != tempNode->stylei)
35、equalKey = 1;break;elseequalKey = 0;if(!equalKey)/相等break;elseclosedHead = closedHead->next;closedHead = closed->next;if(equalKey)/不相等open->next = tempNode;tempNode->next = openHead;tempNode->father = openHead->next;open = open->next;void print(struct node *temp) /输出八数码表for(j =
36、0;j < 9;j+)if(temp->stylej = 0)printf(" t");elseprintf("%dt",temp->stylej);if(j + 1) % 3 = 0)printf("n");void write2txt()ofstream out("F:out_details.txt",ios:app);if( out.fail() )cerr<<"未找到文件"<<endl;out<<" 第"<&
37、lt;+num<<"步n"out<<"open table:n"while(openHead->next->style0 != 9)for(i = 0;i < 9;i +)out<<openHead->next->stylei<<"t"if(i+1) % 3 = 0)out<<"n"out<<"n"openHead = openHead->next;openHead = openHead-
38、>next;out<<"*n"out<<"closed table:n"while(closedHead->next->style0 != 9)for(i = 0;i < 9;i +)out<<closedHead->next->stylei<<"t"if(i + 1) % 3 =0)out<<"n"out<<"n"closedHead = closedHead->next;clos
39、edHead = closedHead->next;out<<"-n"out.close();void main()/updateData();/输入八数码数据for(i = 0;i < 9;i+) /判断初始状态是否已经为最终状态if(wholeStylei = standard1i);elseif(i = 3)&&(wholeStylei = standard16);else if(i = 6)&&(wholeStylei = standard13);else startKey = 1;break;if(!star
40、tKey)printf("不用判断!n");return;printf("要判断!n");openHead = new node();open = new node();openHead->style0 = 9;openHead->next = open;for(i = 0;i < 9;i+)open->stylei = wholeStylei;open->next = openHead;open->father = openHead;closedHead = new node();closed = new node(
41、);closedHead->style0 = 9;closedHead->next = closedHead;closed = closedHead;while(open->style0 != 9)/当open表不为空时一直循环judge1(openHead->next);if(local % 3 > 0)/右移equalKey = 1;tempNode = new node();for(i = 0;i < 9;i+)tempNode->stylei = openHead->next->stylei;tempSpace = tempNode
42、->stylelocal - 1;tempNode->stylelocal - 1 = tempNode->stylelocal;tempNode->stylelocal = tempSpace;judge3();if(endKey)break;if(local > 2)/下移equalKey = 1;tempNode = new node();for(i = 0;i < 9;i+)tempNode->stylei = openHead->next->stylei;tempSpace = tempNode->stylelocal -
43、3;tempNode->stylelocal - 3 = tempNode->stylelocal;tempNode->stylelocal = tempSpace;judge3();if(endKey)break;if(local % 3 < 2)/左移equalKey = 1;tempNode = new node();for(i = 0;i < 9;i+)tempNode->stylei = openHead->next->stylei;tempSpace = tempNode->stylelocal + 1;tempNode->
44、;stylelocal + 1 = tempNode->stylelocal;tempNode->stylelocal = tempSpace;judge3();if(endKey)break;if(local < 6)/上移equalKey = 1;tempNode = new node();/tempNode = malloc(sizeof(struct node);for(i = 0;i < 9;i+)tempNode->stylei = openHead->next->stylei;tempSpace = tempNode->stylel
45、ocal + 3;tempNode->stylelocal + 3 = tempNode->stylelocal;tempNode->stylelocal = tempSpace;judge3();if(endKey)break;closed->next = openHead->next;/把open的标头添加到closed表中openHead->next = openHead->next->next; closed = closed->next;closed->next = closedHead;write2txt();open-&
46、gt;next = tempNode;/把找到的新节点添加到open表中tempNode->next = openHead;tempNode->father = openHead->next;open = open->next;closed->next = openHead->next;/把open的标头添加到closed表中openHead->next = openHead->next->next; closed = closed->next;closed->next = closedHead;write2txt();answ
47、er = new node();tempNode = new node();tempNode = open;while(tempNode->style0 != 9)/将结果路径存于answeranswer = tempNode;tempNode = tempNode->father;tempNode->next = answer;num = 0;while(answer->next->style0 != 9)/输出answerprintf("*第%d步*n",num+);print(answer);answer = answer->nex
48、t;printf("n");printf("*第%d步*n",num+);print(answer);if(answer->style3 != standard13)printf("n!输入的八数码不合法,不能从初始状态到最终状态nnnn");return;4. A算法/*说明* * A算法实现八数码问题 * */#include<iostream>#include<fstream>#include<iomanip>using namespace std;void print(struct n
49、ode *temp);int wholeStyle9 = 2,8,3,1,6,4,7,0,5;int standard19 = 1,2,3,8,0,4,7,6,5;int local,i,j;int tempSpace;struct node *openHead,*open; /open表struct node *closedHead,*closed; /closed表struct node *tempNode; /临时节点struct node *answer; /找到的路径int num = 0;bool endKey;struct nodeint depth;int judgement_based;int style9;struct node *next;struct node *father;void updateData() /更新要判断数据int i;cout<<"请输入八数码原始状态:"<<endl;for(i = 0;i < 9;i+)cin>>wholeStylei;cout<<"请输入八数码最终状态:"<<endl;for(i = 0;i < 9;i+)cin>>standard1i;int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年四氢苯酐合作协议书
- 2025年计划生育技术服务合作协议书
- 2025年悬挂式离子风机合作协议书
- 2025年秸种腐熟剂合作协议书
- 养殖业饲料供应及回收协议
- 跨境金融服务外包协议
- 2025年焦作考运安驾驶员考试答案危险品运输
- 商业照明设计及安装维护合作协议
- 公司债权转股合同书
- 企业信息化系统集成项目合作协议
- 八年级道法与法治下册试卷
- DL-T 1071-2023 电力大件运输规范
- 房屋续租再签合同范本
- 暑期酒店营销方案及策略
- 九江三支一扶真题2023
- 三维圆柱扰流-卡门涡街数值仿真方法-详细教程
- 2024年《社会工作综合能力(初级)》考前冲刺备考速记速练300题(含答案)
- 2024年苏州资产管理有限公司招聘笔试冲刺题(带答案解析)
- 手术室误吸应急预案
- (新平台)国家开放大学《药物化学》形考任务1-3参考答案
- 客车防雨密封性要求及试验方法
评论
0/150
提交评论