算法实验报告Word文档下载推荐.docx
- 文档编号:17660639
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:14
- 大小:204.46KB
算法实验报告Word文档下载推荐.docx
《算法实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《算法实验报告Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
(1)i行(上方),从i列到n-i列
(2)n+1-i列(右侧),从i行到n-i行
(3)n+1-i行(下方),从i列到n-i列
(4)i列(左侧),从n+1-i行到ni+1行
当n为奇数时中间一个数没有形成圈,所以当为奇数时,要单独赋值为n*n.
1-7算法实现
#include<
iostream>
#include<
iomanip>
usingnamespacestd;
voidmain()
{
inti,j,n,k,a[100][100]={0};
cout<
<
"
请输入n:
;
cin>
>
n;
k=1;
for(i=1;
i<
=n/2;
i++)//控制圈数
{
for(j=i;
j<
=n-i;
j++)//上方
{
a[i][j]=k;
k++;
}
j++)//右侧
{
a[j][n+1-i]=k;
for(j=n+1-i;
j>
=i+1;
j--)//下方
a[n+1-i][j]=k;
j--)//左侧
a[j][i]=k;
}
if(n%2==1)//当n为奇数时中间一个数没有形成圈
i=(n+1)/2;
a[i][i]=n*n;
}
for(intc=1;
c<
=n;
c++)
cout<
'
\n'
for(intd=1;
d<
d++)
cout<
setw(6)<
left<
a[c][d]<
"
//空6个字符输出
1-8测试与说明
输入n的值,打印n*n的螺旋矩阵如下
1-9总结
对于趣味矩阵的算法实现,首先要观察矩阵的特点,还有规律,而且一般矩阵都使用二维数组。
cout<
配合使用
实验二
2-1问题描述
写出计算ackermann函数ack(m.n)的递归计算函数
2-2问题分析
对于m>
=0.n>
=0.ack(m,n)
ack(0,n)=n+1;
ack(m,0)=ack(m-1,1);
ack(m,n)=ack(m-1,ack(m,n-1))
2-3策略选择
使用递归算法,不断调用本身实现算法,公式题目已经给出。
2-4模型
递归调用
2-5时间及空间复杂度
2-6算法描述
当m=0时返回n+1;
当n=0时调用ack(m,0)=ack(m-1,1);
当m!
=0&
&
n!
=0时调用自身ack(m,n)=ack(m-1,ack(m,n-1)
2-7算法实现
intakm(intm,intn)
{//递归设计
intr,g;
if(m==0)
r=n+1;
elseif(n==0)
r=akm(m-1,1);
else{
g=akm(m,n-1);
r=akm(m-1,g);
//两次连着递归
}
returnr;
main(){
inta,b,c,i;
while
(1)
{
printf("
inputtwonumbersaandb(a<
4):
);
scanf("
%d%d"
&
a,&
b);
if(a<
4)//为了防止无限进行下去
c=akm(a,b);
//调用函数计算结果
printf("
theresultis:
%d"
c);
elseprintf("
输入错误/n"
//输入不合法
是否继续
(1)yes
(2)no:
i);
if(i!
=1)
break;
}
2-8测试与说明
输入a和b,为了防止不断调用,限制a<
4
输入1继续,2退出
2-9总结
更好的理解了递归思想,和使用方法,递归在很大程度上增加了程序了理解性,减少了代码量。
实验三
3-1问题描述
狼找兔子问题:
一座山周围有n个洞,顺时针编号为0,1,2,3,4,…,n-1。
一只狼从0号洞开始,顺时针方向计数,每当经过第m个洞时,就进洞找兔子。
输入m,n。
试问兔子有没有幸免的机会?
如果有该藏在哪儿?
3-2问题分析
一座山周围有n个洞,顺时针给他编号为0,1,2,3,4,…,n-1。
从0号洞开始,顺时针方向计数,每当经过第m个洞时,问兔子有没有幸免的机会,输出洞的编号
3-3策略选择
使用标志位标记。
n个洞,编号为0,1,2,3,4,…,n-1。
从0号洞开始,顺时针方向计数,每当经过第m个洞时,改标志位为1。
第二次到0时说明会重复这个过程,所以不用再循环,如果还有洞的标志位还有有幸免的机会,输出洞的编号
3-4模型
例17手拉手问题
3-5时间及空间复杂度
3-6算法描述
3-7算法实现
intmain()
intn,m,i,c;
intflag=0;
intj=0,k=0;
inta[50],b[50];
请输入山周围的洞口总数:
endl<
请输入狼每次经过洞口的个数:
m;
洞口号码依次为:
for(i=0;
i++)
a[i]=i;
a[i]<
狼依次经过的洞口号码为:
0"
b[0]=1;
c=0;
c+=m;
if(c>
=n)
c=c-n;
b[c]=1;
if(c==0)
if(b[i]!
=1)
兔子有幸免的机会"
endl;
兔子可以藏在"
洞口中"
flag=1;
if(flag==0)
兔子没有幸免的机会"
return0;
3-8测试与说明
输入洞口数还有每次访问的值则输出所需内容
3-9总结
标志位的使用,当为多种可能时候用数组,为两种情况时,使用变量
实验四
4-1问题描述
假设有52张纸牌,现在扑克牌全正面向上,第一轮从第二张开,凡是2的倍数位置上的牌翻为反面;
第二轮,凡是3的倍数的位置上,正面的翻为反面,反面翻为正面。
依次递推,当翻牌的数量大于104则停止翻牌。
统计最后由几张牌翻为正面,和它所对应的位置。
4-2问题分析
有52张纸牌,开始时扑克牌全正面向上,之后依次依次以2.3.4可以整除的数翻面,翻面超过104次的,则停止翻面,统计最后由几张牌翻为正面,和它所对应的位置。
4-3策略选择
使用标志位数组来记录他的正反面。
4-4模型
例26开灯问题
4-5时间及空间复杂度
4-6算法描述
a[52]为标志位,标志位正反面,每翻过一次求反,正为1反为-1,循环外层为k2,3,4……
每次为k的倍数i%k==0则反面a[i]=-a[i]控制翻面次数num;
a[i]=1时Cnum++记录为正的个数。
4-7算法实现
math.h>
inti,k,num=0,Cnum=0,a[52];
=52;
a[i]=1;
for(k=2;
k++)
for(i=1;
if(i%k==0)
{
a[i]=-a[i]
num++;
}
if(num>
=104)
break;
if(num>
if(a[i]==1)
Cnum++;
cout<
Cnum;
4-8测试与说明
输出为正面的牌的编号,和他们的个数,一共有26个
4-9总结
num>
=104控制翻面次数时,内外都需要判断,才能准确退出;
用数组作为标志位,正为1反为-1;
=104
实验五
5-1问题描述
两个乒乓球队进行分组,各出三人,甲队有ABC3人,乙队有XYZ3人,已经抽签决定比赛名单,有人向队员打听比赛名单,A说她不和X比,C说他不和X和Z比,请编写算法找出3对赛手的名单。
5-2问题分析
此问题为信息数字化的题目,根据题中的条件排除组合的可能性,将剩余的结果输出。
5-3策略选择
i是a的对手;
j是b的对手;
k是c的对手,对ijk进行赋值,是他满足,互不相同,且A说她不和X比,C说他不和X和Z比,相当于i!
='
X'
&
k!
Z'
。
5-4模型
例32警察抓小偷问题
5-5时间及空间复杂度
5-6算法描述
首先他们的对手不能互相重叠,需要一一对应(i!
=j)(i!
=k&
j!
=k),其次,题中给出的消息得到(i!
),将组合排除,剩下为结果
5-7算法实现
stdio.h>
{chari,j,k;
//i是a的对手;
k是c的对手
for(i='
for(j='
j++)
if(i!
=j)
for(k='
k<
=k)
)
A--%cB---%cC--%c\n"
i,j,k);
getchar();
5-8测试与说明
结果为A和Z一组B和X一组C和Y一组
5-9总结
问题为信息数字化的题目,应该将要排除的条件找出,特别是隐藏的条件,用于排除可能结果。
Getchar();
会让我们输入一个数才退出,所以会看到结果;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)