今天考试,一道题目类似全排列的思想,我的全排列模板如下:
void Pern(int list[], int k, int n) {
if (k == n - 1) {
for (int i = 0; i < n; i++) {
printf("%d", list[i]);
}
printf("\n");
}else {
for (int i = k; i < n; i++) { swap(list[k], list[i]);
Pern(list, k + 1, n);
swap(list[k], list[i]);
}
}
}
int main(){
Pern(vis,0,n);
return 0;
}
和网上一样。
这个全排列我本以为没问题的,但是它对于这题无用。确切来说是没什么用,我一开始调试,用了以下数据。
Input:
3
3 13 1
总共输出 6 个,但是应该输出 5 个结果,他有重复的,这代码没问题,对这组数据来说是不对的。于是蒟蒻就去尝试去重,当时没发现是数据的原因。
不过好在后来一顿玄学操作他居然A了,自己感到很奇怪。
我想问的是:有没有一种排列方式,使得任意数位的数组的全排列构成的新数没有重复?
假设是这种数据
3
3 13 1
他输出
3131
3113
1331
1313
1133
1313
其实如果加上空格是这样子的:
3 13 1
3 1 13
13 3 1
13 1 3
1 13 3
1 3 13
这就是我想问的,如何使得它构成的新数也不会重复。