数据结构课程设计地图着色.docx
《数据结构课程设计地图着色.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计地图着色.docx(17页珍藏版)》请在冰豆网上搜索。
数据结构课程设计地图着色
院系:
计算机科学学院
专业:
计算机科学与技术
年级:
2011级
课程名称:
人工智能导论
学号:
11061151
姓名:
冶湖明
指导教师:
郑波尽
2013年12月11日
年级
2011级
班号
计科5班
学号
11061151
专业
计算机科学与技术
姓名
冶湖明
实验名称
实验一:
水壶问题
实验
类型
设计型
综合型
创新型
√
实
验
目
的
或
要
求
实验题目:
水壶问题:
(1)有一根水管,有无限的水
(2)有两个水壶,分别是3升和4升
(3)请分别量出1~10升水
实
验
原
理
(
算
法
流
程
)
实验步骤:
1、程序代码
#include
#include
main()
{
intL3=3;
intL4=4;
intL1_3,L1_4,L;
inta;
printf("请输入你想要得到多少水(单位:
升):
");
scanf("%d",&a);
do{
printf("请输入你想要得到多少水(单位:
升):
");
scanf("%d",&a);
if(a==1)
{
printf("将4升的水壶装满水,向3升的水壶中倒入3升水,剩下1升倒入容器,即可得到!
\n",a);
}
elseif(a%3==0)
{
L1_3=a/3;
printf("你可以向容器中倒入%d桶3升的水壶得到!
\n",L1_3);
}
elseif(a%4==0)
{
L1_4=a/4;
printf("你可以向容器中倒入%d桶4升的水壶得到!
\n",L1_4);
}
elseif(a%3==1)
{
L1_3=a/3;
printf("你可以向容器中倒入%d桶3升的水壶的水,然后再将4升的水壶装满水,向3升的水壶中倒入3升水,剩下1升倒入容器,即可得到!
\n",L1_3);
}
elseif(a==2)
{
L1_3=2;
printf("将4升的水壶装满水,向3升的水壶中倒入3升水,剩下1升倒入容器,重复此步骤两次即可得到!
\n",L1_3);
}
elseif(a%4==1)
{
L1_4=a/4;
printf("你可以向容器中倒入%d桶4升的水壶的水,然后再将4升的水壶装满水,向3升的水壶中倒入3升水,剩下1升倒入容器,即可得到!
\n",L1_4);
}
}while(a>0);
}
2、程序运行结果截图
组
内
分
工
(
可
选
)
无
实
验
结
果
分
析
及
心
得
体
会
实验心得:
通过这次测试技术的实验,使我学到了不少实用的知识,更重要的是,做实验的过程,思考问题的方法,这与做其他的实验是通用的,真正使我们受益匪浅.
成
绩
评
定
教师签名:
2013年月日
备注:
源代码附后,源代码要求有注释说明
年级
2011级
班号
计科5班
学号
11061151
专业
计算机科学与技术
姓名
冶湖明
实验名称
实验二:
传教士野人问题
实验
类型
设计型
综合型
创新型
√
实
验
目
的
或
要
求
题目:
传教士人数M,野人C,M≥C,开始都在岸左边,
①船只能载两人,传教士和野人都会划船
②两岸边保证野人人数不能大于传教士人数,否则传教士将被野人吃掉
把所有人都送过河,设计方案,要求编程实现。
实
验
原
理
(
算
法
流
程
)
实验步骤:
1、程序代码
#include
#include
#defineSTEP_MAX20//来回过河的次数
#defineKIND_NUM3//每个种类的数量
#defineBOAT_NUM2//船的载重量
typedefenum
{
BOAT_THIS,//船在本岸
BOAT_THAT,//船在对岸
}boat_t;
typedefenum
{
ROAD_GO,//过河
ROAD_COME,//回来
}road_t;
typedefstruct
{
intye;//对岸野人数量
intman;//对岸传教士数量
boat_tboat;//船是否在对岸
}state_t;//一种局面
typedefstruct
{
intye;//野人过河数量
intman;//传教士过河的数量
road_troad;//回来或过河
}step_t;//一个步骤
state_tstates[STEP_MAX]={0};
step_tsteps[STEP_MAX]={0};
//判断所有的野人和传教士是否都到了对岸
boolfinal(state_ts)
{
conststate_tcs=
{
KIND_NUM,
KIND_NUM,
BOAT_THAT
};
if(memcmp(&cs,&s,sizeof(state_t))==0)
{
returntrue;
}
returnfalse;
}
//是否会发生野人杀传教士
boolbad(state_ts)
{
if(((KIND_NUM-s.ye)>(KIND_NUM-s.man)&&(KIND_NUM-s.man)>0)
||(s.ye>s.man&&s.man>0))
{
returntrue;
}
returnfalse;
}
//第n种局面是否跟前面的相重复
boolrepeat(state_ts[],intn)
{
inti;
for(i=0;i{//已经有这种情况了
if(memcmp(&states[i],&states[n],sizeof(states[i]))==0)
{
returntrue;
}
}
returnfalse;
}
voidoutput(step_tsteps[STEP_MAX],intn)
{
char*kinds[KIND_NUM]={"野人","传教士"};
char*routine[2]={"过河.","回来."};
inti;
for(i=0;i{
if((steps[i].ye*steps[i].man)>0)
{
printf("%d个%s和%d个%s%s\n",steps[i].ye,kinds[0],
steps[i].man,kinds[1],routine[steps[i].road]);
}
elseif(steps[i].ye>0)
{
printf("%d个%s%s\n",steps[i].ye,kinds[0],
routine[steps[i].road]);
}
elseif(steps[i].man>0)
{
printf("%d个%s%s\n",steps[i].man,kinds[1],
routine[steps[i].road]);
}
}
printf("\n");
}
//搜索过河方案(n表示过河次数)
voidsearch(intn)
{
inti,j;
if(n>STEP_MAX)
{//步数限制太少了
printf("StepOverflow!
");
return;
}
if(final(states[n]))
{//都到对岸了
output(steps,n);
return;
}
if(bad(states[n]))
{//发生了野人杀传教士了
return;
}
if(repeat(states,n))
{//与前面的局面相重复了
return;
}
if(states[n].boat==BOAT_THIS)
{//船在本岸
for(i=0;i<=BOAT_NUM&&i<=(KIND_NUM-states[n].ye);i++)
for(j=0;j<=BOAT_NUM-i&&j<=(KIND_NUM-states[n].man);j++)
{
if(i==0&&j==0)
{
continue;
}
steps[n].ye=i;
steps[n].man=j;
steps[n].road=ROAD_GO;
memcpy(&states[n+1],&states[n],sizeof(state_t));
states[n+1].ye+=i;
states[n+1].man+=j;
states[n+1].boat=BOAT_THAT;
search(n+1);
}
}
else
{
for(i=0;i<=BOAT_NUM&&i<=states[n].ye;i++)
for(j=0;j<=BOAT_NUM-i&&j<=states[n].man;j++)
{
if(i==0&&j==0)
{
continue;
}
steps[n].ye=i;
steps[n].man=j;
steps[n].road=ROAD_COME;
memcpy(&states[n+1],&states[n],sizeof(state_t));
states[n+1].ye-=i;
states[n+1].man-=j;
states[n+1].boat=BOAT_THIS;
search(n+1);
}
}
}
intmain()
{
search(0);
return0;
}
2、程序运行结果截图
组
内
分
工
(
可
选
)
无
实
验
结
果
分
析
及
心
得
体
会
实验心得:
通过这次测试技术的实验,使我学到了不少实用的知识,更重要的是,做实验的过程,思考问题的方法,这与做其他的实验是通用的,真正使我们受益匪浅.
成
绩
评
定
教师签名:
2013年月日
备注:
源代码附后,源代码要求有注释说明
年级
2011级
班号
计科5班
学号
11061151
专业
计算机科学与技术
姓名
冶湖明
实验名称
实验三:
演化算法
实验
类型
设计型
综合型
创新型
√
实
验
目
的
或
要
求
题目:
根据以下MATLAB程序编写C语言代码
pop=rand(20,1)*10;%随机产生初始群体
objvalue=10*sin(5*pop)+7*cos(4*pop);%//10*sin(5*x)+7*cos(4*x);
fori=1:
200%200为迭代次数
forj=1:
19
a=rand();
x=a*pop(j)+(1-a)*pop(j+1);
obj=10*sin(5*x)+7*cos(4*x);
ifobj>objvalue(j)
pop(j)=x;
objvalue(j)=obj;
end
end
end
实
验
原
理
(
算
法
流
程
)
实验步骤:
1、程序代码
#include
#include
#include
#include
main()
{
inti,j;
floata,x,obj;
floatobjvalue[20],pop[20];
srand((int)time(0));
for(j=0;j<20;j++)
{
pop[j]=((float)10.0*rand()/(RAND_MAX));
objvalue[j]=10*sin(5*pop[j])+7*cos(4*pop[j]);
}
for(i=0;i<=200;i++)
{
for(j=0;j<20;j++)
{
a=((float)rand()/(RAND_MAX));
x=a*pop[j]+(1-a)*pop[(j+1)%20];
obj=10*sin(5*x)+7*cos(4*x);
if(obj>objvalue[j])
{
pop[j]=x;
objvalue[j]=obj;
}
printf("\tx=%4f",x);
printf("\tobj=%4f\n",obj);
}
}
2、程序运行结果截图
组
内
分
工
(
可
选
)
无
实
验
结
果
分
析
及
心
得
体
会
实验心得:
通过这次测试技术的实验,使我学到了不少实用的知识,更重要的是,做实验的过程,思考问题的方法,这与做其他的实验是通用的,真正使我们受益匪浅.
成
绩
评
定
教师签名:
2013年月日
备注:
源代码附后,源代码要求有注释说明