q********a 发帖数: 165 | 1 不是任何面试题,是我自己需要解决的一个问题,但我手艺不精,搞不定,拜托帮我看看怎
么写code.
就是从1到10, 十个整数, 两个两个组对,比如
1 2,3 4,5 6,7 8,9 10
1 2,3 4,5 6,8 9,7,10
...
我需要得出所有的组合, 咋整?
谢谢! | D****A 发帖数: 360 | 2 recursion.
pairs(n) = {1..n-1 × n} U pairs(n-1)
【在 q********a 的大作中提到】 : 不是任何面试题,是我自己需要解决的一个问题,但我手艺不精,搞不定,拜托帮我看看怎 : 么写code. : 就是从1到10, 十个整数, 两个两个组对,比如 : 1 2,3 4,5 6,7 8,9 10 : 1 2,3 4,5 6,8 9,7,10 : ... : 我需要得出所有的组合, 咋整? : 谢谢!
| q********a 发帖数: 165 | 3 多谢! 能再通俗易懂些吗? 我不是专业写code的...
上programing课的时候最头疼的就是recursion,这么多年不用它也糊过来了...
【在 D****A 的大作中提到】 : recursion. : pairs(n) = {1..n-1 × n} U pairs(n-1)
| X****r 发帖数: 3557 | 4 如果不考虑效率的话(比如你这里只有10个数)可以直接利用C++的next_permutation
(如果你不用C++的话next_permutation的代码也很简单),滤掉所有重复的就行了:
#include
template bool next_pairs(T begin, T end) {
while (std::next_permutation(begin, end)) {
T p;
for (p = begin; p != end; p += 2) {
if (*p > *(p+1) || p+2 != end && *p > *(p+2)) {
break;
}
}
if (p == end) {
return true;
}
}
return false;
}
用法:
int x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int x_end = x + sizeof(x) / sizeof(*x)
【在 q********a 的大作中提到】 : 不是任何面试题,是我自己需要解决的一个问题,但我手艺不精,搞不定,拜托帮我看看怎 : 么写code. : 就是从1到10, 十个整数, 两个两个组对,比如 : 1 2,3 4,5 6,7 8,9 10 : 1 2,3 4,5 6,8 9,7,10 : ... : 我需要得出所有的组合, 咋整? : 谢谢!
| X****r 发帖数: 3557 | 5 后面那个n-1应该是n-2
【在 D****A 的大作中提到】 : recursion. : pairs(n) = {1..n-1 × n} U pairs(n-1)
| D****A 发帖数: 360 | 6 不用recursion也成,你就
int pairs (int n) {
int i, j;
if (n < 2)
return -1;
for (i = 1; i <= n - 1; i++)
for (j = i + 1; j <= n; j++)
printf ("%d %d\n", i, j);
return 0;
}
【在 q********a 的大作中提到】 : 多谢! 能再通俗易懂些吗? 我不是专业写code的... : 上programing课的时候最头疼的就是recursion,这么多年不用它也糊过来了...
| X****r 发帖数: 3557 | 7 你理解错楼主的意思了吧,楼主要的结果的每一项都是5对,由所有的10个数两两组成。
比如以下列出的是所有结果的10/945:
1 2, 3 4, 5 6, 7 8, 9 10
1 2, 3 4, 5 6, 7 9, 8 10
1 2, 3 4, 5 6, 7 10, 8 9
1 2, 3 4, 5 7, 6 8, 9 10
1 2, 3 4, 5 7, 6 9, 8 10
1 2, 3 4, 5 7, 6 10, 8 9
1 2, 3 4, 5 8, 6 7, 9 10
1 2, 3 4, 5 8, 6 9, 7 10
1 2, 3 4, 5 8, 6 10, 7 9
1 2, 3 4, 5 9, 6 7, 8 10
【在 D****A 的大作中提到】 : 不用recursion也成,你就 : int pairs (int n) { : int i, j; : if (n < 2) : return -1; : for (i = 1; i <= n - 1; i++) : for (j = i + 1; j <= n; j++) : printf ("%d %d\n", i, j); : return 0; : }
| q********a 发帖数: 165 | 8 谢谢, 谢谢! 是这个意思, 效率不重要, 我就要这个结果, 然后output给下一步用...
成。
【在 X****r 的大作中提到】 : 你理解错楼主的意思了吧,楼主要的结果的每一项都是5对,由所有的10个数两两组成。 : 比如以下列出的是所有结果的10/945: : 1 2, 3 4, 5 6, 7 8, 9 10 : 1 2, 3 4, 5 6, 7 9, 8 10 : 1 2, 3 4, 5 6, 7 10, 8 9 : 1 2, 3 4, 5 7, 6 8, 9 10 : 1 2, 3 4, 5 7, 6 9, 8 10 : 1 2, 3 4, 5 7, 6 10, 8 9 : 1 2, 3 4, 5 8, 6 7, 9 10 : 1 2, 3 4, 5 8, 6 9, 7 10
| D****A 发帖数: 360 | 9 。。。。。
一看组合以为是10取2呢,LOL
成。
【在 X****r 的大作中提到】 : 你理解错楼主的意思了吧,楼主要的结果的每一项都是5对,由所有的10个数两两组成。 : 比如以下列出的是所有结果的10/945: : 1 2, 3 4, 5 6, 7 8, 9 10 : 1 2, 3 4, 5 6, 7 9, 8 10 : 1 2, 3 4, 5 6, 7 10, 8 9 : 1 2, 3 4, 5 7, 6 8, 9 10 : 1 2, 3 4, 5 7, 6 9, 8 10 : 1 2, 3 4, 5 7, 6 10, 8 9 : 1 2, 3 4, 5 8, 6 7, 9 10 : 1 2, 3 4, 5 8, 6 9, 7 10
| X****r 发帖数: 3557 | 10 希望我没有理解错你的意思,就是这五对的顺序不相关,每对之内的顺序也不相关。
比如
1 10, 2 9, 3 8, 4 7, 5 6
和
1 10, 2 9, 3 8, 5 6, 7 4
是同一个结果,不希望重复列出。
其实用递归也不太复杂:
#include
void print(int x[], int n) {
int i;
for (i = 0; i < n; i += 2) {
if (i) {
printf(", ");
}
printf("%d %d", x[i], x[i+1]);
}
printf("\n");
}
void print_pairs(int x[], int n, int i) {
if (i == n) {
// Get one set of result, do something on x[].
print(x, n);
} else {
int tmp, j;
for (j = ++i; j < n; j++) {
if (
【在 q********a 的大作中提到】 : 谢谢, 谢谢! 是这个意思, 效率不重要, 我就要这个结果, 然后output给下一步用... : : 成。
| z****e 发帖数: 2024 | 11 orz
【在 X****r 的大作中提到】 : 希望我没有理解错你的意思,就是这五对的顺序不相关,每对之内的顺序也不相关。 : 比如 : 1 10, 2 9, 3 8, 4 7, 5 6 : 和 : 1 10, 2 9, 3 8, 5 6, 7 4 : 是同一个结果,不希望重复列出。 : 其实用递归也不太复杂: : #include : void print(int x[], int n) { : int i;
|
|