题库 信息学奥赛题库 题目列表 (排列数)输入两个正整数 n,m(1≤n≤20,1≤m≤n),在 1∼n...
组合题

(排列数)输入两个正整数 n,m(1≤n≤20,1≤m≤n),在 1∼n 中任取 m 个数,按字典序从小到大输出所有这样的排列。例如:

输入:3 2

输出:1 2 1 3 2 1 2 3 3 1 3 2

#include <iostream>
#include <cstring>
using namespace std;
const intSIZE = 25;
boolused[SIZE];
intdata[SIZE];
intn, m, i, j, k;
boolflag;
int main() {
	cin >> n >> m;
	memset( used, false, sizeof(used) );
	for ( i = 1; i <= m; i++ ) {
		data[i] = i;
		used[i] = true;
	}
	flag = true;
	while ( flag ) {
		for ( i = 1; i <= m - 1; i++ )
			cout << data[i] << " ";
		cout << data[m] << endl;
		flag = ①;
		for ( i = m; i >= 1; i-- ) {
			②;
			for ( j = data[i] + 1; j <= n; j++ )
				if ( !used[j] ) {
					used[j] = true;
					data[i] = ③;
					flag= true;
					break;
				}
			if ( flag ) {
				for ( k = i + 1; k <= m; k++ )
					for ( j = 1; j <= ④; j++ )
						if ( !used[j] ) {
							data[k] = j;
							used[j] = true;
							break;
						}
				⑤;
			}
		}
	}
}
第 1 题 填空
第 2 题 填空
第 3 题 填空
第 4 题 填空
第 5 题 填空
题目信息
阅读程序 2012年 初赛
-
正确率
0
评论
26
点击
QQ
微信