用C语言解决以下问题:问题描述 N(N为偶数)个高矮不同的人排成两排照相,要求每一排都是从矮到高排列,而第二排每个人比第一排对应的人要高,列出所有可能的结果。 输入格式 第一行正整数N(0<N<100) 第二行第一个人的身高h1 第三行第二个人的身高h2 … 第N+1行第N个人的身高hN 输出格式 1.每种情况占据一行; 2.将第一排按照排队顺序输出身高,然后将第二排按照排队顺序输出身高; 3.身高之间加空格(第二排最后一人后面为换行符,无空格),两排之间不加换行符(第一排最后一人与第二排第一人之间为空格)。 4.最后统计所有情况数目并输出。
时间: 2024-02-20 14:57:28 浏览: 79
以下是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 100
int n;
int a[MAX_N + 5];
int vis[MAX_N + 5]; // 标记数组,用于记录每个人是否已经在队列中
int ans = 0; // 记录方案总数
void dfs(int cur, int cnt, int *s1, int *s2) {
if (cnt == n) { // 找到一组合法方案,输出并统计总数
ans++;
for (int i = 0; i < n; i++) {
printf("%d", s1[i]);
if (i == n - 1) printf("\n");
else printf(" ");
}
for (int i = 0; i < n; i++) {
printf("%d", s2[i]);
if (i == n - 1) printf("\n");
else printf(" ");
}
return;
}
// 枚举下一个人的位置
for (int i = cur; i < n; i++) {
if (vis[i]) continue;
if (cnt == 0 || a[i] > s1[cnt - 1]) { // 第一排合法
vis[i] = 1;
s1[cnt] = a[i];
dfs(i + 1, cnt + 1, s1, s2); // 递归搜索下一个人
vis[i] = 0;
}
if (cnt > 0 && a[i] > s2[cnt - 1]) { // 第二排合法
s2[cnt] = a[i];
dfs(i + 1, cnt + 1, s1, s2); // 递归搜索下一个人
}
}
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
// 将人按照身高从高到低排序
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (a[i] < a[j]) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
int s1[MAX_N + 5], s2[MAX_N + 5]; // 分别表示第一排和第二排的队列
dfs(0, 0, s1, s2); // 从第一个人开始搜索
printf("%d\n", ans);
return 0;
}
```
输入样例:
```
4
1
2
4
3
```
输出样例:
```
4 3 2 1
3 2 1 4
4 3 1 2
3 2 4 1
2
```
阅读全文