VB八数码问题人工智能.docx
- 文档编号:3281818
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:12
- 大小:28.35KB
VB八数码问题人工智能.docx
《VB八数码问题人工智能.docx》由会员分享,可在线阅读,更多相关《VB八数码问题人工智能.docx(12页珍藏版)》请在冰豆网上搜索。
VB八数码问题人工智能
问题描述:
在3×3的区域内,有8个数字和一个空格。
和空格相邻的数字可以向上、向下、向左或向右移动。
那么,如何将初始状态通过上述操作变为目标状态?
算法分析:
解决此类问题的办法是宽度搜索,深度搜索耗时太大无法接受。
当需要移动的步数很多时,普通的宽度搜索仍旧无法满足需要,需要对其进行优化。
这个问题也可以推广到流行的拼图游戏。
程序代码:
#include
#include
typedefstructNode{
intnum[9];//棋盘状态
intdeepth;//派生的深度g(n)
intdiffnum;//不在位的数目h(n)
intvalue;//耗散值f(n)=g(n)+h(n)
structNode*pre;
structNode*next;
structNode*parent;
}numNode;/*----------endofstructnumNode----------*/
intorigin[9];//棋盘初始状态
inttarget[9];//棋盘目标状态
intnumNode_num,total_step;
numNode*open,*close;//Open表和Close表
numNode*create_numNode()
{
return(numNode*)malloc(sizeof(numNode));
}
numNode*open_getfirst(numNode*head);//返回第一项,并从Open表中删除
voidopen_insert(numNode*head,numNode*item);//向Open表中按序插入新节点
voidclose_append(numNode*head,numNode*item);//向Close表中插入新节点
intexpand(numNode*item);//扩展节点
intprint_result(numNode*item);//打印结果
numNode*copy_numNode(numNode*orgin);
charisNewNode(numNode*open,numNode*close,intnum[9]);
//是否在Open表或Close表中
voidprint_num(intnum[9]);//打印棋盘状态
intdiff(intnum[9]);//求不在位棋子的个数
voidinit();//初始化,获得棋盘初始状态和目标状态
voidswap(int*a,int*b);
intoperate(intnum[],intop);
voidfree_list(numNode*head);
/*
*===FUNCTION======================================================================
*Name:
主函數
*Description:
程序入口
*=====================================================================================
*/
int
main(intargc,char*argv[])
{
//初始化Open表和Close表
open=create_numNode();
close=create_numNode();
open->pre=open->next=close->pre=close->next=NULL;
init();//由用户输入初始和目标状态
//初始化初始节点
numNode*p1;
p1=create_numNode();
p1->parent=NULL;
p1->deepth=0;
inti=0;
for(i=0;i<9;i++)
{
p1->num[i]=origin[i];
}
open_insert(open,p1);
numNode_num=1;
p1=open_getfirst(open);
while(p1!
=NULL)
{
close_append(close,p1);
if(expand(p1))
returnEXIT_SUCCESS;
p1=open_getfirst(open);
}
printf("Nosolution!
\n");
returnEXIT_SUCCESS;
}/*----------endoffunctionmain----------*/
void
init()
{
while
(1)
{
printf("Pleaseinputopriginalstatus:
\nForexample:
123456780standsfor\n"
"123\n"
"456\n"
"780\n");
chartemp[10];
scanf("%s",&temp);
inti=0;
for(i=0;i<9&&temp[i]-'0'>=0&&temp[i]-'0'<=8;i++)
{
origin[i]=temp[i]-'0';
}
printf("Pleaseinputtargetstatus:
\n");
scanf("%s",&temp);
intj=0;
for(j=0;j<9&&temp[j]-'0'>=0&&temp[j]-'0'<=8;j++)
{
target[j]=temp[j]-'0';
}
system("cls");
if(i==9&&j==9)
{
break;
}
}
}/*-----endoffunctioninit-----*/
void
open_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;
}
}/*-----endoffunctionopen_insert-----*/
numNode*
open_getfirst(numNode*head)
{
numNode*p;
if(head->next==NULL)
{
returnNULL;
}
p=head->next;
head->next=p->next;
if(p->next!
=NULL)
{
p->next->pre=head;
}
p->pre=NULL;
p->next=NULL;
returnp;
}/*-----endoffunctionopen_getfirst-----*/
void
close_append(numNode*head,numNode*item)
{
item->next=head->next;
item->pre=head;
head->next=item;
if(item->next!
=NULL)
{
item->next->pre=item;
}
}/*-----endoffunctionclose_append-----*/
int
expand(numNode*p1)
{
numNode*p2;
intop=1;
for(op=1;op<=4;op++)
{
p2=copy_numNode(p1);
operate(p2->num,op);
if(isNewNode(open,close,p2->num)=='N')
{
p2->parent=p1;
p2->deepth=p1->deepth+1;
p2->diffnum=diff(p2->num);
p2->value=p2->deepth+p2->diffnum;
if(p2->diffnum==0)
{
total_step=print_result(p2);
printf("Totalstep:
%d\n",total_step);
free_list(open);
free_list(close);
return1;
}
else
{
numNode_num++;
open_insert(open,p2);
}
}
else
free(p2);
}
return0;
}/*-----endoffunctionexpand-----*/
int
operate(intm[],intop)
{
intblank;
blank=0;
while(m[blank]!
=0&&blank<9)
++blank;
if(blank==9)
return1;
switch(op){
case1:
/*up*/
if(blank>2)
swap(m+blank,m+blank-3);
break;
case2:
/*down*/
if(blank<6)
swap(m+blank,m+blank+3);
break;
case3:
/*left*/
if(blank!
=0&&blank!
=3&&blank!
=6)
swap(m+blank,m+blank-1);
break;
case4:
/*right*/
if(blank!
=2&&blank!
=5&&blank!
=8)
swap(m+blank,m+blank+1);
break;
default:
return1;
}
return0;
}
void
swap(int*a,int*b)
{
intc;
c=*a;
*a=*b;
*b=c;
}
numNode*
copy_numNode(numNode*origin)
{
numNode*p;
p=create_numNode();
p->deepth=origin->deepth;
p->diffnum=origin->diffnum;
p->value=origin->value;
inti;
for(i=0;i<9;i++)
{
(p->num)[i]=(origin->num)[i];
}
returnp;
}/*-----endoffunctioncopy_numNode-----*/
int
diff(intnum[9])
{
inti,diffnum=0;
for(i=0;i<9;i++)
if(num[i]!
=target[i])
diffnum++;
returndiffnum;
}/*-----endoffunctiondiff-----*/
char
isNewNode(numNode*open,numNode*close,intnum[9])
{
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';//Open
p=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';//Close
p=p->next;
}
return'N';
}/*-----endoffunctionisNewNode-----*/
void
free_list(numNode*head)
{
numNode*p,*q;
p=head->next;
while(p!
=NULL)
{
q=p->next;
free(p);
p=q;
}
free(head);
}/*-----endoffunctionfree_list-----*/
void
print_num(intnum[9])
{
inti;
for(i=0;i<9;i++)
{
printf("%d\t",num[i]);
if((i%3)==2)
printf("\n");
}
}/*-----endoffunctionprint_num-----*/
int
print_result(numNode*item)
{
numNode*p;
intstep;
p=item;
if(p!
=NULL)
{
step=print_result(p->parent);
printf("\nStep%d:
\n",step+1);
print_num(p->num);
returnstep+1;
}
else
{
return-1;
}
}
实验结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VB 数码 问题 人工智能