我现在已经解决了这个问题一天了,感觉我无处可去。
在1-9之间生成九位数的所有可能组合,但没有数字可以相同。换句话说,我的目标是准确生成362880(9!)个数字,每个数字彼此唯一,每个数字必须只包含每个数字中的一个。不应该有随机性。
我想要的是什么:
123456789
213796485
我想要的是什么:
111111111
113456789
我首先创建一个数组来存储数字。
float num[9];
使用我num[0]
可以是9位数中的任何一位的原则,并且num[8]
必须是剩余的数字,我尝试了嵌套循环。我会发布代码,但是没有必要指出它为什么不起作用,因为我已经知道了原因。但是,我不知道如何解决它。
for (int a = 1; a < 10; a++) {
num[0] = a;
for (int b = 1; b < 9; b++) {
if (b != a)
num[1] = b;
// The code in between follows the same pattern
for (int i = 1; i < 2; i++) {
if (i != a && i != b && i != c && i != d && i != e && i != f && i != g && i != h) {
num[8] = i;
}
}
}
}
如您所见,最后一位数字始终为1,第二位数字永远不会为9,依此类推。
那么我有什么选择?我尝试制作它以便它总共循环9 ^ 9次,这将解决我提到的问题,但这当然效率太低(并且它也没有按预期工作)。
有什么想法吗?我觉得这应该是一件容易解决的事情,但我似乎无法绕过它。
答案 0 :(得分:2)
这是一个简单的解决方案,按字典顺序生成362880个排列:
#include <stdio.h>
#include <string.h>
void perm9(char *dest, int i) {
if (i == 9) {
printf("%.9s\n", dest);
} else {
for (char c = '1'; c <= '9'; c++) {
if (memchr(dest, c, i) == NULL) {
dest[i] = c;
perm9(dest, i + 1);
}
}
}
}
int main(void) {
char dest[9];
perm9(dest, 0);
return 0;
}