用C语言实现N(N为偶数)个高矮不同的人排成两排照相,要求每一排都是从矮到高排列,而第二排每个人比第一排对应的人要高,列出所有可能的结果。 输入的格是第一行正整数N(0<N<100),第二行第一个人的身高h1,第三行第二个人的身高h2,第N+1行第N个人的身高hN 输出的格式是: 1.每种情况占据一行; 2.将第一排按照排队顺序输出身高,然后将第二排按照排队顺序输出身高; 3.身高之间加空格(第二排最后一人后面为换行符,无空格),两排之间不加换行符(第一排最后一人与第二排第一人之间为空格)。 4.最后统计所有情况数目并输出。
时间: 2023-11-27 22:55:25 浏览: 57
以下是用C语言实现的程序:
```c
#include <stdio.h>
#include <stdlib.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void print(int *a, int *b, int n) {
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
for (int i = 0; i < n; i++) {
printf("%d", b[i]);
if (i != n - 1) {
printf(" ");
} else {
printf("\n");
}
}
}
void permute(int *a, int *b, int n, int *count) {
if (n == 0) {
print(a, b, count[0]);
count[0]++;
} else {
for (int i = 0; i <= n; i++) {
if (i != n && (a[i] >= a[n] || b[i] >= b[n])) {
continue;
}
swap(&a[i], &a[n]);
swap(&b[i], &b[n]);
permute(a, b, n - 1, count);
swap(&a[i], &a[n]);
swap(&b[i], &b[n]);
}
}
}
int main() {
int n;
scanf("%d", &n);
int *a = (int *)malloc(sizeof(int) * n);
int *b = (int *)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for (int i = 0; i < n; i++) {
scanf("%d", &b[i]);
}
int count = 0;
permute(a, b, n - 1, &count);
printf("%d", count);
free(a);
free(b);
return 0;
}
```
代码主要思路是采用递归的方法,对每个位置进行枚举,如果满足条件就进行交换,并继续递归。最后统计所有情况的个数并输出。
阅读全文