实验三算法与分析设计汇编文档格式.docx
《实验三算法与分析设计汇编文档格式.docx》由会员分享,可在线阅读,更多相关《实验三算法与分析设计汇编文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
评分标准
分值
得分
合计
上机表现
积极出勤、遵守纪律
主动完成实验设计任务
30分
实验报告
及时递交、填写规范
内容完整、体现收获
70分
说明:
评阅教师:
日期:
年月日
实验内容
例2.走迷宫问题
迷宫是许多小方格构成的矩形,如图所示,在每个小方格中有的是墙(图中的“1”)有的是路(图中的“0”)。
走迷宫就是从一个小方格沿上、下、左、右四个方向到邻近的方格,当然不能穿墙。
设迷宫的入口是在左上角(1,1),出口是右下角(8,8)。
根据给定的迷宫,找出一条从入口到出口的路径。
1,1
1
8,8
代码:
#include<
stdio.h>
intmaze[8][8]={
{0,0,0,0,0,0,0,0},
{0,1,1,1,1,0,1,0},
{0,0,0,0,1,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,1,1,0,1,0},
{0,1,0,0,0,0,1,1},
{0,1,0,0,1,0,0,0},
{0,1,1,1,1,1,1,0}};
intfx[4]={1,-1,0,0},fy[4]={0,0,-1,1};
struct
{
intx,y,pre;
}sq[100];
intqh,qe,i,j,k;
check(inti,intj);
voidsearch();
voidout();
voidmain()
search();
printf("
\n"
);
}
voidsearch()
qh=0;
qe=1;
maze[0][0]=-1;
sq[0].pre=0;
sq[0].x=0;
sq[0].y=0;
while(qh!
=qe)
{
qh=qh+1;
for(k=0;
k<
4;
k++)
{
i=sq[qh].x+fx[k];
j=sq[qh].y+fy[k];
if(check(i,j)==1)
qe=qe+1;
sq[qe].x=i;
sq[qe].y=j;
sq[qe].pre=qh;
maze[i][j]=-1;
if(sq[qe].x==7&
&
sq[qe].y==7)
{
out();
return;
}
}
}
nonsolution.\n"
check(inti,intj)
intflag=1;
if(i<
0||i>
7||j<
0||j>
7)
flag=0;
if(maze[i][j]==1||maze[i][j]==-1)
return(flag);
voidout()
(%d,%d)"
sq[qe].x,sq[qe].y);
while(sq[qe].pre!
=0)
qe=sq[qe].pre;
printf("
——(%d,%d)"
}
用例:
例4
有如图所示的七巧板,试设计算法,使用至多4种不同的颜色对七巧板进行涂色(每块涂一种颜色),要求相邻区域的颜色互不相同,打印输出所有可能的涂色方案。
#include"
stdio.h"
intdata[7][7]={{0,1,0,0,1,0,1},{1,0,0,1,0,1,0},
{0,0,0,1,0,0,1},{0,1,1,0,0,1,1},
{1,0,0,0,0,0,1},{0,1,0,1,0,0,0},
{1,0,1,1,1,0,0}},n,color[7],total;
voidtre(ints);
intcolorsame(ints);
intj;
for(j=0;
j<
7;
j++)
color[j]=0;
total=1;
tre(0);
\nTotal=%d\n"
total-1);
voidtre(ints)
inti;
if(s>
6)
out();
else
for(i=1;
i<
=4;
i++)
color[s]=i;
if(colorsame(s)==0)
tre(s+1);
intcolorsame(ints)
inti,flag;
flag=0;
for(i=0;
i<
=s-1;
if(data[i][s]==1&
color[i]==color[s])
flag=1;
\nserialnumber:
%d\t"
total);
for(i=0;
=6;
i++)
color[i]);
total=total+1;
例7马的遍历问题
在n*m的棋盘中,马只能走日字。
马从位置(x,y)处出发,把棋盘的每一点都走一次,且只走一次,找出所有路径
代码:
intn=5,m=4;
intfx[8]={1,2,2,1,-1,-2,-2,-1},fy[8]={2,1,-1,-2,-2,-1,1,2},a[5][4];
intdep,x,y,count;
voidoutput();
intcheck(intxx,intyy);
voidfind(intx,inty,intdep);
inti,j;
count=0;
dep=1;
X,Y坐标:
"
scanf("
%d,%d"
&
x,&
y);
if(x>
n||y>
m||x<
0||y<
0)
x,yerror!
!
return;
for(i=0;
n;
for(j=0;
m;
a[i][j]=0;
a[x][y]=1;
find(x,y,2);
if(count==0)
printf("
nosolution!
else
voidfind(intx,inty,intdep)
inti,xx,yy;
8;
xx=x+fx[i];
yy=y+fy[i];
if(check(xx,yy)==1)
a[xx][yy]=dep;
if(dep==m*n)
output();
else
find(xx,yy,dep+1);
a[xx][yy]=0;
voidoutput()
count++;
count=%d"
count);
for(y=0;
y<
y++)
for(x=0;
x<
x++)
%4d"
a[y][x]);
printf("
intcheck(intxx,intyy)
intf=1;
if(xx>
=n||yy>
=m||xx<
0||yy<
0)
f=0;
elseif(a[xx][yy]!
returnf;
例12
按排列树搜索解决8皇后问题
inta[100],n,s=0,c[100],d[20];
voidswap(intt1,intt2);
voidTry(intt);
voidTry(intt)
if(t>
n)
output();
else
for(j=t;
=n;
swap(t,j);
if(c[t+a[t]]==0&
d[t-a[t]+n]==0)
c[t+a[t]]=1;
d[t-a[t]+n]=1;
Try(t+1);
c[t+a[t]]=0;
d[t-a[t]+n]=0;
for(j=1;
%2d"
a[j]);
s=s+1;
voidswap(intt1,intt2)
intt;
t=a[t1];
a[t1]=a[t2];
a[t2]=t;
inputn:
%d"
n);
for(i=1;
a[i]=i;
c[i]=0;
c[n+1]=0;
d[i]=0;
d[n+i]=0;
Try
(1);
\n总共情况:
s=%d\n"
s);
实验总结
本次实验是对书上的例题进行验证和理解。
通过本次的实验让我初步对图的搜索和遍历有了一定的了解。
在这次实验中我进一步掌握回溯法和分支限界策略的设计思想与方法以及掌握回溯法和分支限界策略的编程实现与优化。
通过本次实验我学到了很多。