问题标题: 酷町堂:4935 下一个排列 经验值

0
0
已解决
许金夫
许金夫
初级天翼
初级天翼

经验值:800

题目描述 Description

给出一个正整数n,以及从1到n的一个排列,试求出这个排列的后一个排列。

输入描述 Input Description

第一行,一个正整数n
第二行,从1到n的一个排列

输出描述 Output Description

所给出排列的下一个排列,数据保证存在下一个排列

样例输入 Sample Input

3 1 2 3

样例输出 Sample Output

1 3 2

数据范围及提示 Data Size & Hint

n<=20

我的WA0分代码:

#include <bits/stdc++.h>
using namespace std;
int used[10];
int pl[10];
int a[10];
int n,cnt=0;
bool f=1;
int k=0;
void dfs(int t){
	if(t>n){
		if(k==0){
			for(int i=1;i<=n;i++){
				if(a[i]!=pl[i])f=0;
			}
		}
		if(f==1)k++;
		if(k==2){
			for(int i=1;i<=n;i++){
				cout<<pl[i]<<" ";
			}
		}
		return ;
	}
	if(k!=2){
		for(int i=1;i<=n;i++){
			if(used[i]==0){
				pl[t]=i;
				used[i]=1;
				dfs(t+1);
				used[i]=0;
			}
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	} 
	dfs(1); 
	return 0;
}

 

许金夫在2020-05-08 20:11:13追加了内容


0
已采纳
黄子扬
黄子扬
初级天翼
初级天翼

咋不结帖,dfs也可以,但时间复杂度高,康托展开s快

0
0
0
0
黄子扬
黄子扬
初级天翼
初级天翼

康托展开呗,丝毫没有难度,不会请自行百度

0
缪鲲鹏
缪鲲鹏
新手光能
新手光能

这不就是3571的改编版吗

我要回答