算法设计实验题目汇总Word文档下载推荐.docx
《算法设计实验题目汇总Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《算法设计实验题目汇总Word文档下载推荐.docx(57页珍藏版)》请在冰豆网上搜索。
1062ProblemDGeneralSearch38
1020PermutationwithRepetition
Description
R={r1,r2,…,rn}是要进行排列的n个元素。
其中元素r1,r2,…,rn可能相同。
试设计一个算法,列出R的所有不同排列。
编程任务:
给定n以及待排列的n个元素。
计算出这n个元素的所有不同排列。
Input
输入由多组测试数据组成。
每组测试数据的第1行是元素个数n,1<
=n<
=500。
接下来的1行是待排列的n个元素。
Output
对应每组输入,将计算出的n个元素的所有不同排列输出,每种排列单独一行。
最后1行中的数是排列总数。
SampleInput
4
aacc
SampleOutput
aaccacacaccacaaccacaccaa6
#include<
stdio.h>
algorithm>
usingnamespacestd;
intans;
intok(charstr[],inta,intb)
{
if(b>
a)
for(inti=a;
i<
b;
i++)
if(str[i]==str[b])
return0;
return1;
}
voidperm(charstr[],intk,intm)
inti;
if(k==m)
{
ans++;
for(i=0;
i<
=m;
i++)
printf("
%c"
str[i]);
}
\n"
);
else
for(i=k;
i<
i++)
if(ok(str,k,i))
swap(str[k],str[i]);
perm(str,k+1,m);
swap(str[k],str[i]);
intmain(intargc,char*argv[])
charstr[1000];
intn;
while(scanf("
%d"
&
n)!
=EOF)
ans=0;
scanf("
%s"
str);
perm(str,0,n-1);
%d\n"
ans);
return0;
1021双色Hanoi塔问题
A、B、C是3个塔座。
开始时,在塔座A上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。
各圆盘从小到大编号为1,2,……,n,奇数号圆盘着蓝色,偶数号圆盘着红色,如图所示。
现要求将塔座A上的这一叠圆盘移到塔座B上,并仍按同样顺序叠置。
在移动圆盘时应遵守以下移动规则:
规则
(1):
每次只能移动1个圆盘;
规则
(2):
任何时刻都不允许将较大的圆盘压在较小的圆盘之上;
规则(3):
任何时刻都不允许将同色圆盘叠在一起;
规则(4):
在满足移动规则
(1)-(3)的前提下,可将圆盘移至A,B,C中任一塔座上。
试设计一个算法,用最少的移动次数将塔座A上的n个圆盘移到塔座B上,并仍按同样顺序叠置。
对于给定的正整数n,编程计算最优移动方案。
每组测试数据的第1行是给定的正整数n。
对应每组输入,输出的每一行由一个正整数k和2个字符c1和c2组成,表示将第k个圆盘从塔座c1移到塔座c2上。
3
1AB
2AC
1BC
3AB
1CA
2CB
iostream>
usingnamespacestd;
intmain()
{voidhanoi(int,char,char,char);
intm;
cin>
>
m;
hanoi(m,'
A'
'
B'
C'
);
}
voidhanoi(intn,chara,charb,charc)
{voidmove(int,char,char);
if(n==1)move(n,a,b);
else
{hanoi(n-1,a,c,b);
move(n,a,b);
hanoi(n-1,c,b,a);
}
voidmove(intn,charx,chary)
{cout<
<
n<
"
x<
<
y<
endl;
1022SearchNumber
科研调查时得到了n个自然数,每个数均不超过1500000000。
已知不相同的数不超过10000个,现在需要在其中查找某个自然数,如找到则输出并统计这个自然数出现的次数,如没找到则输出NO。
每组测试数据输入包含n+1行;
第一行是两个整数n和x,n表示自然数的个数,x表示要查找的自然数,两者之间用空格隔开;
第2至n+1每行一个自然数。
对应每组输入,如果查找到x,则每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开;
如果没有查找到x,则每行输出NO.
8100
2
5
100
83
1002
NO
#include<
string.h>
#defineLEN200000
inta[LEN],temp,mid;
intsort(int*a,intlow,inthigh)//一趟快排
{
mid=a[low];
while(low<
high)
high&
&
a[high]>
=mid)high--;
temp=a[low];
a[low]=a[high];
a[high]=temp;
a[high]<
=mid)low++;
returnlow;
voidquicksort(int*a,intlow,inthigh)//快排递归
//intmid;
if(low<
high)
mid=sort(a,low,high);
quicksort(a,low,mid-1);
quicksort(a,mid+1,high);
inti,n,s;
intSum=0;
scanf("
n);
s);
for(i=0;
i<
n;
i++)
{scanf("
a[i]);
quicksort(a,0,n-1);
//调用快排
i++)//统计不同数字的个数
if(a[i]==s)
Sum++;
if(Sum==0)
NO"
else
%d%d"
s,Sum);
1023整数划分问题
将正整数n表示成一系列正整数之和:
n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。
正整数n的这种表示称为正整数n的划分。
求正整数n的不同划分个数。
例如正整数6有如下11种不同的划分:
6;
5+1;
4+2,4+1+1;
3+3,3+2+1,3+1+1+1;
2+2+2,2+2+1+1,2+1+1+1+1;
1+1+1+1+1+1。
输入包含n+1行;
第一行是一个整数n,表示有n个测试用例;
第2至n+1每行一个正整数。
对应每组输入,输出正整数n的不同划分个数。
6
7
11
intsplit(intn,intm)
if(n<
1||m<
1)return0;
if(n==1||m==1)return1;
m)returnsplit(n,n);
if(n==m)return(split(n,m-1)+1);
if(n>
m)return(split(n,m-1)+split((n-m),m));
intmain()
intk,i;
inta[100];
k);
for(i=0;
k;
split(a[i],a[i]));
1024ProblemA:
Counting
问题描述:
一本书的页码从自然数1开始顺序编码直到自然数n。
书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。
例如,第6页用数字6表示,而不是06或006等。
数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2,…,9。
给定表示书的总页码的10进制整数n(1≤n≤109)。
编程计算书的全部页码中分别用到多少次数字0,1,2,…,9。
每组测试数据输入只有1行,给出表示书的总页码的整数n。
对应每组输入,输出共有10行,在第k行输出页码中用到数字k-1的次数,k=1,2,…,10。
S