School idol project

为了吸引新学生并挽救面临低新生数量威胁的软件学院,一群学生决定启动一个偶像项目,组建一个九人组合。面对学生对课程难度的担忧,他们通过项目计划来提升学院吸引力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Bad news! It is said that School of Software is going to be repealed because of low amount of new student. Many people says that TAs always give assignments which are too difficult to finish. Most high school graduates decide not to choose SS after hearing that.

To attract new students and save our school, some SSers decide to start a school idol project. They plan to set up an idol group which contains 9 members ( it seems that 9 is a popular size of school idol group ).

Now there are N students who wants to join the project, numbered from 0 to N-1. Please write a program to output all the possible combinations of the 9 school idols.

The input contains only one number N.

You should output at most 1000 lines, each line is one of the combinations. You should output them in alphabet order. In each line, numbers should be separated by space. There shouldn’t be any spaces at the end of a line. And there should be an empty line at the end of your output.

If C(N, 9) > 1000, output the first 1000 combinations.

Sample Input

10

Sample Output

0 1 2 3 4 5 6 7 8

0 1 2 3 4 5 6 7 9

0 1 2 3 4 5 6 8 9

0 1 2 3 4 5 7 8 9

0 1 2 3 4 6 7 8 9

0 1 2 3 5 6 7 8 9

0 1 2 4 5 6 7 8 9

0 1 3 4 5 6 7 8 9

0 2 3 4 5 6 7 8 9

1 2 3 4 5 6 7 8 9

For all test cases, 9 <= N <= 10000

(高端做法)

#include <stdio.h>

int counter = 0;

void dfs(const int index, int *s, const int n) {
    if (index == 9) {
        int i;
        for (i = 0; i < 8; ++i)
            printf("%d ", s[i]);
        printf("%d\n", s[8]);
        ++counter;
    } else {
        for (s[index] = s[index-1]+1; s[index] < n-8+index && counter < 1000;
             ++s[index])
            dfs(index+1, s, n);
    }
}

int main() {
    int s[9], n;
    scanf("%d", &n);
    for (s[0] = 0; s[0] < n-8; ++s[0])
        dfs(1, s, n);
    return 0;
}

(低端做法)

#include <stdio.h>
int main() {
    int a1, a2, a3, a4, a5, a6, a7, a8, a0;
    int n;
    scanf("%d", &n);
    int flag = 0;
    for (a0 = 0; a0 < n - 8; a0++) {
        for (a1 = a0 + 1; a1 < n - 7; a1++) {
            for (a2 = a1 + 1; a2 < n - 6; a2++) {
                for (a3 = a2 + 1; a3 < n - 5; a3++) {
                    for (a4 = a3 + 1; a4 < n - 4; a4++) {
                        for (a5 = a4 + 1; a5 < n - 3; a5++) {
                            for (a6 = a5 + 1; a6 < n - 2; a6++) {
                                for (a7 = a6 + 1; a7 < n - 1; a7++) {
                                    for (a8 = a7 + 1; a8 < n; a8++) {
                                        printf("%d ", a0);
                                        printf("%d ", a1);
                                        printf("%d ", a2);
                                        printf("%d ", a3);
                                        printf("%d ", a4);
                                        printf("%d ", a5);
                                        printf("%d ", a6);
                                        printf("%d ", a7);
                                        printf("%d\n", a8);
                                        flag++;
                                        if (flag >= 1000) {
                                            return 0;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值