共42道题,当前是第40

Description

题目描述

小帅的幼儿园有 n 个小朋友,在一次升旗仪式中,共有 n 个可以上场的小朋友,现在共需要 m 个小朋友来组成仪仗队,请你列举出所有可能的仪仗队,并按照字典序进行输出。

输入说明

输入共一行,两个正整数 n, m,分别表示能上场的小朋友的数目和仪仗队的人数。

输出说明

输出有若干行,每一行有 m 个数,表示一种可能的仪仗队组成形式,并按照字典序输出。

样例输入

3 2

样例输出

1 2

1 3

2 1

2 3

3 1

3 2

请补全下面的代码

1 	#include <bits/stdc++.h>
2 	using namespace std;
3	const int N = 25;
4	int n, m, data[N];
5	bool flag, used[N];
6	int main(){
7		cin >> n >> m;
8		memset(used, false, sizeof(used));
9		for (int i = 1; i <= m; ++i){
10			data[i] = i;
11			used[i] = true;
12		}
13		flag = true;
14		while (flag){
15			for (int i = 1; i <= m - 1; ++i)
16				cout << data[i] << " ";
17			cout << data[m] << endl;
18			flag = ___ (1) ___;
19			for (int i = m; i >= 1; --i){
20				___ (2) ___;
21				if (!used[j]){
22					used[j] = true;
23					data[i] = ___ (3) ___;
24					flag = true;
25					break;
26				}
27			}
28			if (flag){
29				for (int k = i + 1; k <= m; ++k){
30					for (int j = 1; j <= ___ (4) ___; ++j){
31						if (!used[j]){
32							data[k] = j;
33							used[j] = true;
34							break;
35						}
36					}
37				}
38				___ (5) ___;
39			}
40		}
41		return 0;
42	}

这段代码的主要原理是通过一个已经有的排列,推断出该排列在字典序中的下一个排列。操作方法很简单:假设当前排列中的第 i 个的值为 data[i] ,那么就倒着寻找第一个可以使 data[i] 变大的下标, 设为k,令 data[k] 变成一个更大的数字,这样就可以使得字典序增大。同时为了保证这是在字典序上直接与当前排列相邻的排列,我们需要让 data[k+1..m] 这部分构成的序列字典序最小(在不修

 
data[1..k-1] 的情况下)。所以我们需要重新对其值进行分配,也就是代码中 if(flag) 分支的部

1.    A。

2.    D。

3.    A。

4.    A。

5.    D。

Question

___ (1) ___ 处应该填 ()

___ (2) ___ 处应该填 ()

___ (3) ___ 处应该填 ()

___ (4) ___ 处应该填 ()

___ (5) ___ 处应该填 ()

陈伦制作 版权所无 粤ICP备16127491号-1