用C语言实现N(N为偶数)个高矮不同的人排成两排照相,要求每一排都是从矮到高排列,而第二排每个人比第一排对应的人要高,列出所有可能的结果。 输入的格是第一行正整数N(0<N<100),第二行第一个人的身高h1,第三行第二个人的身高h2,第N+1行第N个人的身高hN 输出的格式是: 1.每种情况占据一行; 2.将第一排按照排队顺序输出身高,然后将第二排按照排队顺序输出身高; 3.身高之间加空格(第二排最后一人后面为换行符,无空格),两排之间不加换行符(第一排最后一人与第二排第一人之间为空格)。 4.最后统计所有情况数目并输出。
时间: 2023-11-27 17:55:07 浏览: 64
以下是用C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 100
int h[MAX_N], vis[MAX_N] = {0}; // 存储身高和标记是否已选
int ans = 0; // 统计情况数
void dfs(int cur, int n, int *a, int *b) {
if (cur == n + 1) { // 已经排好了所有人
for (int i = 1; i <= n; i++) {
printf("%d ", a[i]); // 输出第一排身高
}
printf("\n");
for (int i = 1; i <= n; i++) {
printf("%d", b[i]); // 输出第二排身高
if (i < n) printf(" "); // 最后一个人后面不加空格
}
printf("\n\n");
ans++; // 情况数加一
return;
}
for (int i = 1; i <= n; i++) {
if (!vis[i]) { // 如果当前人还没被选
if (cur == 1 || (cur > 1 && h[i] > a[cur - 1])) { // 第一排满足条件
if (cur == 1 || (cur > 1 && h[i] > b[cur - 1])) { // 第二排满足条件
vis[i] = 1; // 标记为已选
a[cur] = h[i]; // 放入第一排
b[cur] = h[i] + 1; // 放入第二排
dfs(cur + 1, n, a, b); // 继续排下一个人
vis[i] = 0; // 回溯,标记为未选
}
}
}
}
}
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &h[i]);
}
int a[MAX_N] = {0}, b[MAX_N] = {0}; // 存储两排的身高
dfs(1, n, a, b);
printf("Total: %d", ans); // 输出总情况数
return 0;
}
```
思路如下:
- 使用深度优先搜索(dfs)枚举所有可能的排列情况。
- 使用 `vis` 数组标记每个人是否已经选过。
- 用 `cur` 记录当前已经排好了几个人。
- `a` 数组和 `b` 数组分别存储第一排和第二排的身高。
- 每次选人时,先判断该人是否已选,然后再判断是否满足排队条件。
- 如果满足条件,将该人放入第一排和第二排,并递归地继续排下一个人。
- 当所有人都排好了,输出当前情况,并将情况数加一。
- 最后输出总情况数。
时间复杂度为 $O(n!)$,空间复杂度为 $O(n)$。
阅读全文