一个问题(玄关
  • 板块学术版
  • 楼主封禁用户
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/3 14:22
  • 上次更新2023/11/2 16:19:17
查看原帖
一个问题(玄关
1016319
封禁用户楼主2023/10/3 14:22

今天考试,一道题目类似全排列的思想,我的全排列模板如下:

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

总共输出 66 个,但是应该输出 55 个结果,他有重复的,这代码没问题,对这组数据来说是不对的。于是蒟蒻就去尝试去重,当时没发现是数据的原因。

不过好在后来一顿玄学操作他居然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

这就是我想问的,如何使得它构成的新数也不会重复。

2023/10/3 14:22
加载中...