新人求助
查看原帖
新人求助
390094
大探险家朵拉楼主2021/4/11 17:05

我做题时发现大的全排列可以推排列数,但是不明白,所以发出来分享一下

题目描述:

给你一个数字n,然后再给个数字x,让你从区间[1,n]的数字中找出x个数字排成一列,请你按字典序从小到大输出他们。(就是找排列数)

样例输入

3 2

样例输出

1 2
1 3
2 1
2 3
3 1
3 2

如果是[1,3]的话全排列输出就是

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

发现没有其实就是全排列的前两项

所以只要取全排列前x项,然后去重就可以找到排列数!

这是我这道题的代码

#include <iostream>
#include <algorithm>
using namespace std;
int n,x,t,last,nt,t1;
int a[25];
int main() {
	cin>>n;
	cin>>x;
	for (int i=1; i<=n; i++)
		a[i] = i;//输入函数所用材料;
	do {
		for (int i=1; i<=x; i++) {
			if(i==x)
				t+=a[i];
			else {
				t+=a[i];
				t*=10;//转换为一个数方便比较,但同时会颠倒(所以之后要颠倒回来)如1 2 3->321
			}
		}
		if(t!=last) {//去重
			nt=t;
			while(nt>=10) {
				t1+=nt%10;
				t1*=10;
				nt/=10;
			}
			if(nt<10)
				t1+=nt;
			while(t1>=10) {
				cout<<t1%10<<" ";
				t1/=10;
			}
			if(t1<10)
				cout<<t1;
			cout<<endl;
			t1=0;
			last=t;//颠倒数字,如321->123.
		}
		t=0;
	} while (next_permutation(a+1, a+n+1));//全排列函数
}

我刚学c++有点傻,数字不知道怎么颠倒,只能硬搞,所以怪怪的. 我已经也不知道怎么描述代码,就尽量写了一些注释.希望能好看懂一点

2021/4/11 17:05
加载中...