1. (递归实现选择排序)请完善下面的程序,读入n个整数,用选择排序对这n个数从小到大排序后输出。
输入:
共2行。
第一行一个整数n((1 ≤ n ≤ 100)。
第二行用空格分隔的n个数。
输出:
共一行,经过排序后的n个整数。整数之间用一个空格分隔。
输入样例:
10
1 3 2 6 3 4 9 8 7 2
输出样例:
1 2 2 3 4 5 6 7 8 9
#include <iostream>
using namespace std;
int a[100],n;
void SelectSort(int s, int e) //对数组元素a[s]到a[e]从小到大排序;
{
if (e>s)
{
int k=s;
for (int i=s+1; i<=e; i++)
if(a[i]<a[k])
k=i;
if ( k!=s )
{
int temp=a[k];
a[k]=a[s] ;
a[s]=temp;
}
SelectSort(s+1,e) ;
}
}
int main()
{
cin>>n;
for (int i=1; i<=n; i++)
cin>>a[i];
SelectSort(1,n) ;
for (int i=1; i<n或 i<=n-1 ; i++)
cout<<a[i]<<' ';
cout<<a[n]<<endl;
return 0;
}
2. (家谱树》小明的家谱中共有n(编号为1到n)个人,相互关系构成了一棵树。现给出家谱中人员之间的相互关系。求出家谱中子孙(不包括自己)共有m个的人数。
输入:
第一行2个整数n(1≤n≤100)和m(1≤n≤100)。
接下来n-1行,每行两个整数x,y(1≤x,y ≤100),表示x是y的父亲
输出:
输出一行1个整数,表示家谱中子孙共有m个的人数。
输入样例:
9 2
1 2
1 6
2 3
2 4
2 5
6 7
7 8
7 9
输出样例:
2
算法分析:本题主要通过枚举和深搜实现。由于家谱树中的每个结点的子孙结点等于其子结点总数加上各子结点的子孙结点总数。所以在实现时依次枚举各结点。并通过深搜统计以该结点为根的子树结点数之和ans(不包过根结点),如果ans等于m。则给结果cnt加1。
#include <iostream>
#include <cstring>
using namespace std;
int ans,a[101][101],c[101];
//a[i][j]表示编号为i的人的第j个孩子的编号
//c[i]存储编号为i的人的孩子总数
void dfs(int i)
{
if ( c[i]==0 )
return ;
ans += c[i];
for (int j=1; j<=c[i]; j++)
dfs(a[i][j]) ;
}
int main()
{
int n,m,x,y,cnt;
cin>>n>>m;
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
for (int i=1; i<=n-1; i++)
{
cin>>x>>y;
c[x]++ ;
a[x][c[x]]=y;
}
cnt=0;
for (int i=1; i<=n; i++)
{
ans=c[i] ;
for (int j=1; j<=c[i]; j++)
dfs(a[i][j]);
if ( ans==m )
cnt++;
}
cout<<cnt<<endl;
return 0;
}