八数码问题.docx
- 文档编号:24058750
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:45
- 大小:22.90KB
八数码问题.docx
《八数码问题.docx》由会员分享,可在线阅读,更多相关《八数码问题.docx(45页珍藏版)》请在冰豆网上搜索。
八数码问题
不同的人,对待资料有不同的态度,说实话,我要的是积分,你呢?
如果你是河工大的学生,那么我是你10级学哥,自己努力,没有什么不行的!
好好学习,天天向上
把数码问题就是把一串数字变成下面这个样子:
123
804
765
实现方法
1.
过程表示
源代码:
#include
staticintstyle[9]={1,2,3,6,7,4,5,8,0};//输入的数码
//2,5,4,3,0,7,1,8,63,2,1,8,0,4,7,6,51,0,4,2,7,3,8,5,61,0,3,8,2,4,7,6,5
staticintarrayStep41[6]={5,4,3,6,7,8};//第四步和第六步共用的数组,所以设为全局量
staticintarrayStep71[4]={3,6,7,4};
staticintlocal;//空格的位置
inti,j;//所用到的变量
intnumber=0;//记录移动步数
voidprint();
voidstep1();
voidstep2();
voidstep3();
voidstep4();
voidstep5();
voidstep6();
voidstep7();
voidstep8();
voidstep9();
voidexchange(intx,inty);
voidjudge();
voidjudge()//判断空格位置
{
number=0;
for(i=0;i<9;i++)
{
if(style[i]==0)
{
local=i;
return;
}
}
}
voidexchange(intx,inty)//交换两个数
{
inttemp;
print();
temp=style[x];
style[x]=style[y];
style[y]=temp;
local=y;
number++;
}
voidstep1()
{
intarrayStep11[5]={3,0,1,2,5};
intarrayStep12[6]={6,7,8,5,2,1};
if((style[2]!
=0)&&style[2]!
=1)
return;
else
{
if(local==2)
{
if(style[1]==1)
exchange(2,5);
else
exchange(2,1);
return;
}
else
{
if(local==4)
{
exchange(4,1);
i=2;
while(local!
=5)
{
exchange(arrayStep11[i],arrayStep11[i+1]);
i++;
}
return;
}
for(i=0;i<3;i++)
{
if(arrayStep11[i]==local)
{
while(local!
=5)
{
exchange(arrayStep11[i],arrayStep11[i+1]);
i++;
}
return;
}
}
for(i=0;i<4;i++)
{
if(arrayStep12[i]==local)
{
while(local!
=1)
{
exchange(arrayStep12[i],arrayStep12[i+1]);
i++;
}
return;
}
}
}
}
return;
}
voidstep2()
{
intarrayStep21[8]={0,3,6,7,8,5,4,1};
for(i=0;i<8;i++)
{
if(arrayStep21[i]==local)
{
while(style[0]!
=1)
{
exchange(arrayStep21[i%8],arrayStep21[(i+1)%8]);
i++;
}
break;
}
}
}
voidstep3()
{
intarrayStep31[8]={2,1,4,3,6,7,8,5};
for(i=0;i<8;i++)
{
if(arrayStep31[i]==local)
{
while(style[1]!
=2)
{
exchange(arrayStep31[i%8],arrayStep31[(i+1)%8]);
i++;
}
break;
}
}
}
voidstep4()
{
for(i=0;i<6;i++)
{
if(arrayStep41[i]==local)
{
while((style[4]!
=3))
{
exchange(arrayStep41[i%6],arrayStep41[(i+1)%6]);
i=(i+1)%6;
}
while(local!
=3)
{
exchange(arrayStep41[i%6],arrayStep41[(i+5)%6]);
i=(i+5)%6;
}
break;
}
}
}
voidstep5()
{
intarrayStep51[9]={3,0,1,4,5,2,1,0,3};
i=0;
do
{
exchange(arrayStep51[i],arrayStep51[i+1]);
i++;
}
while(local!
=3);
}
voidstep6()
{
for(i=0;i<6;i++)
{
if(arrayStep41[i]==local)
{
while(style[5]!
=4)
{
exchange(arrayStep41[i%6],arrayStep41[(i+1)%6]);
i++;
}
if(local==8)
exchange(8,7);
break;
}
}
return;
}
voidstep7()
{
for(i=0;i<4;i++)
{
if(arrayStep71[i]==local)
{
while(style[4]!
=5)
{
exchange(arrayStep71[i%4],arrayStep71[(i+1)%4]);
i=(i+1)%4;
}
while(local!
=3)
{
exchange(arrayStep71[i%4],arrayStep71[(i+3)%4]);
i=(i+3)%4;
}
break;
}
}
}
voidstep8()
{
intarrayStep81[13]={3,0,1,2,5,4,7,8,5,2,1,0,3};
i=0;
do
{
exchange(arrayStep81[i],arrayStep81[i+1]);
i++;
}
while(local!
=3);
}
voidstep9()
{
for(i=0;i<4;i++)
{
if(arrayStep71[i]==local)
{
while(style[7]!
=6)
{
exchange(arrayStep71[i%4],arrayStep71[(i+1)%4]);
i=(i+1)%4;
}
while(local!
=4)
{
exchange(arrayStep71[i%4],arrayStep71[(i+3)%4]);
i=(i+3)%4;
}
break;
}
}
}
voidprint()
{
for(j=0;j<9;j++)
{
if(style[j]==0)
printf("\t");
else
printf("%d\t",style[j]);
if((j+1)%3==0)
printf("\n");
}
printf("************%d***********\n",number);
}
voidloop()
{
printf("请输入数码:
\n");
for(i=0;i<9;i++)
scanf("%d",&style[i]);
judge();
step1();
step2();
step3();
if(style[2]!
=3)
{
step4();
step5();
}
step6();
if(style[8]!
=5)
{
step7();
step8();
}
step9();
print();
if(!
((style[3]==8)&&(style[6]==7)))
printf("用书上所给算法来看此数码错误!
\n");
}
voidmain()
{
while
(1)
loop();
}
2.深度优先实现
/***************说明***********************
用宽度优先搜索算法实现八数码问题
******************************************/
#include
#include
#include
#include
#include"string.h"
#include"assert.h"
#include"windows.h"
usingnamespacestd;
intwholeStyle[9]={2,8,3,1,6,4,7,0,5};
intstandard1[9]={1,2,3,8,0,4,7,6,5};
intlocal,i,j;
intstartKey=0,endKey=0,equalKey=1,tempSpace;
structnode*openHead,*open;//open表
structnode*closedHead,*closed;//closed表
structnode*tempNode;//临时节点
structnode*answer;//找到的路径
intnum=0;
structnode
{
intstyle[9];
structnode*next;
structnode*father;
};
voidupdateData()//更新要判断数据
{
inti;
printf("请输入八数码原始状态:
\n");
for(i=0;i<9;i++)
scanf("%d",&wholeStyle[i]);
printf("请输入八数码最终状态:
\n");
for(i=0;i<9;i++)
scanf("%d",&standard1[i]);
}
voidjudge1(structnode*head)//判断空格位置
{
for(i=0;i<9;i++)
{
if(head->style[i]==0)
{
local=i;
return;
}
}
}
intjudge2(structnode*head)//判断是否与标准八数码相等,不相等返回值为0
{
for(i=0;i<9;i++)
{
if(head->style[i]!
=standard1[i])
{
if((i==3)&&(head->style[3]==standard1[6]))
;
elseif((i==6)&&(head->style[6]==standard1[3]))
;
else
return0;
}
}
return1;
}
voidjudge3()//判断新生成的八数码是否就是最终状态或者在open、closed表中出现
{
if(judge2(tempNode))
endKey=1;
else
{
while(openHead->next->next->style[0]!
=9)
{
for(i=0;i<9;i++)
{
if(openHead->next->next->style[i]!
=tempNode->style[i])
{
equalKey=1;
break;
}
else
equalKey=0;
}
if(equalKey)//不相等
openHead=openHead->next;
else
break;
}
openHead=open->next;
if(equalKey)//不相等
{
while(closedHead->next->style[0]!
=9)
{
for(i=0;i<9;i++)
{
if(closedHead->next->style[i]!
=tempNode->style[i])
{
equalKey=1;
break;
}
else
equalKey=0;
}
if(!
equalKey)//相等
break;
else
closedHead=closedHead->next;
}
closedHead=closed->next;
}
if(equalKey)//不相等
{
open->next=tempNode;
tempNode->next=openHead;
tempNode->father=openHead->next;
open=open->next;
}
}
}
voidprint(structnode*temp)//输出八数码表
{
for(j=0;j<9;j++)
{
if(temp->style[j]==0)
printf("\t");
else
printf("%d\t",temp->style[j]);
if((j+1)%3==0)
printf("\n");
}
}
voidwrite2txt()
{
ofstreamout("F:
\\out_details.txt",ios:
:
app);
if(out.fail())
{
cerr<<"未找到文件"< } out<<"第"<<++num<<"步\n"; out<<"opentable: \n"; while(openHead->next->style[0]! =9) { for(i=0;i<9;i++) { out< if((i+1)%3==0) out<<"\n"; } out<<"\n"; openHead=openHead->next; } openHead=openHead->next; out<<"*********************\n"; out<<"closedtable: \n"; while(closedHead->next->style[0]! =9) { for(i=0;i<9;i++) { out< if((i+1)%3==0) out<<"\n"; } out<<"\n"; closedHead=closedHead->next; } closedHead=closedHead->next; out<<"-----------------------------------\n"; out.close(); } voidmain() { //updateData();//输入八数码数据 for(i=0;i<9;i++)//判断初始状态是否已经为最终状态 { if(wholeStyle[i]==standard1[i]) ; else { if((i==3)&&(wholeStyle[i]==standard1[6])) ; elseif((i==6)&&(wholeStyle[i]==standard1[3])) ; else { startKey=1; break; } } } if(! startKey) { printf("不用判断! \n"); return; } printf("要判断! \n"); openHead=newnode(); open=newnode(); openHead->style[0]=9; openHead->next=open; for(i=0;i<9;i++) open->style[i]=wholeStyle[i]; open->next=openHead; open->father=openHead; closedHead=newnode(); closed=newnode(); closedHead->style[0]=9; closedHead->next=closedHead; closed=closedHead; while(open->style[0]! =9)//当open表不为空时一直循环 { judge1(openHead->next); if(local%3>0)//右移 { equalKey=1; tempNode=newnode(); for(i=0;i<9;i++) tempNode->style[i]=openHead->next->style[i]; tempSpace=tempNode->style[local-1]; tempNode->style[local-1]=tempNode->style[local]; tempNode->style[local]=tempSpace; judge3(); } if(endKey) break; if(local>2)//下移 { equalKey=1; tempNode=newnode(); for(i=0;i<9;i++) tempNode->style[i]=openHead->next->style[i]; tempSpace=tempNode->style[local-3]; tempNode->style[local-3]=tempNode->style[local]; tempNode->style[local]=tempSpace; judge3(); } if(endKey) break; if(local%3<2)//左移 { equalKey=1; tempNode=newnode(); for(i=0;i<9;i++) tempNode->style[i]=openHead->next->style[i]; tempSpace=tempNode->style[local+1]; tempNode->style[local+1]=tempNode->style[local]; tempNode->style[local]=tempSpace; judge3(); } if(endKey) break; if(local<6)//上移 { equalKey=1; tempNode=newnode(); //tempNode=malloc(sizeof(structnode)); for(i=0;i<9;i++) tempNode->style[i]=openHead->next->style[i]; tempSpace=tempNode->style[local+3]; tempNode->style[local+3]=tempNode->style[local]; tempNode->style[local]=tempSpace; judge3(); } if(endKey) break; closed->next=openHead->next;//把open的标头添加到closed表中 openHead->next=openHead->next->next; closed=closed->next; clo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数码 问题
![提示](https://static.bdocx.com/images/bang_tan.gif)