八数码问题.docx

上传人:b****8 文档编号:10118530 上传时间:2023-05-23 格式:DOCX 页数:45 大小:22.90KB
下载 相关 举报
八数码问题.docx_第1页
第1页 / 共45页
八数码问题.docx_第2页
第2页 / 共45页
八数码问题.docx_第3页
第3页 / 共45页
八数码问题.docx_第4页
第4页 / 共45页
八数码问题.docx_第5页
第5页 / 共45页
八数码问题.docx_第6页
第6页 / 共45页
八数码问题.docx_第7页
第7页 / 共45页
八数码问题.docx_第8页
第8页 / 共45页
八数码问题.docx_第9页
第9页 / 共45页
八数码问题.docx_第10页
第10页 / 共45页
八数码问题.docx_第11页
第11页 / 共45页
八数码问题.docx_第12页
第12页 / 共45页
八数码问题.docx_第13页
第13页 / 共45页
八数码问题.docx_第14页
第14页 / 共45页
八数码问题.docx_第15页
第15页 / 共45页
八数码问题.docx_第16页
第16页 / 共45页
八数码问题.docx_第17页
第17页 / 共45页
八数码问题.docx_第18页
第18页 / 共45页
八数码问题.docx_第19页
第19页 / 共45页
八数码问题.docx_第20页
第20页 / 共45页
亲,该文档总共45页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

八数码问题.docx

《八数码问题.docx》由会员分享,可在线阅读,更多相关《八数码问题.docx(45页珍藏版)》请在冰点文库上搜索。

八数码问题.docx

八数码问题

不同的人,对待资料有不同的态度,说实话,我要的是积分,你呢?

如果你是河工大的学生,那么我是你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<next->style[i]<<"\t";

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<next->style[i]<<"\t";

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模板 > 自然景观

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2