正在载入在线练习界面,本页内容可直接阅读…

AK CSP › NOIP 普及 2012 第一轮真题 › 第 35 题

NOIP 普及 2012 第一轮 第 35 题:按字典序生成排列:第 4 空

完善程序 · 枚举与模拟 · 答案 n

题目

完善程序
(排列数) 输入两个正整数 $n,m(1<n<20,1<m<n)$,在 $1\sim n$ 中任取 $m$ 个数,按字典序从小到大输出所有这样的排列。
例如:
输入:3 2
输出:1 2
1 3
2 1
2 3
3 1
3 2

#include <iostream>
#include <cstring>
using namespace std;
const int SIZE =25;
bool used[SIZE];
int data[SIZE];
int n,m,i,j,k;
bool flag;
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;
					}
				[     ⑤   ];
			}
		}
	}
	return 0;
}

本小题

④处应填( )

答案

n

题解

考点定位

本题(排列数第④空)考「后缀重填上界」,对应大纲 4.3.1 生成排列(难度【3】)。

解题过程

④处为 i 之后的位重填最小可用数字,扫描范围到 n:

``cpp for (j = 1; j <= n; j++) ``

答案:n。

易错提醒

① 后缀按「从小到大填未用的数」= 字典序最小的后缀;② 上界 n 是数字值域上界。

真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1 京公网安备11010502062986号