在生成特定的顺序组合 [英] Generate Combinations in specific order

查看:137
本文介绍了在生成特定的顺序组合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要一个函数来生成一个严格的顺序组合。 这里有一个例子:

{0,1,2,3}:

  0 2 1 3
0 1 3 2
0 2 1 3
0 2 3 1
0 3 1 2
0 3 2 1

1 0 2 3
1 0 3 2
1 2 0 3
1 2 3 0
1 3 0 2
1 3 2 0

2 0 1 3
2 0 3 1
2 1 0 3
2 1 3 0
2 3 0 1
2 3 1 0

3 0 1 2
3 0 2 1
3 1 0 2
3 1 2 0
3 2 0 1
3 2 1 0
 

所以,我需要这个特定的顺序,没有任何other.I已经尝试了一些硬code步骤猜测算法,但有一个现有的功能,可以为我做的?

更新:

 的#include< stdio.h中>
#包括< string.h中>

INT主要(无效)
{
炭键[] = {'0','1','2','3','\ 0',};

炭缓冲[] = {'0','1','2','3','\ 0',};

的printf(%S \ N键);

交换(安培;键[2],&安培;按键[3]);

的printf(%S \ N键);

strcpy_s(键,的sizeof(缓冲区),缓冲区);

交换(安培;键[1],&安培;键[2]);

的printf(%S \ N键);

交换(安培;键[2],&安培;按键[3]);

的printf(%S \ N键);

strcpy_s(键,的sizeof(缓冲区),缓冲区);

交换(安培;键[1],&安培;按键[3]);

交换(安培;键[2],&安培;按键[3]);

的printf(%S \ N键);

交换(安培;键[2],&安培;按键[3]);

的printf(%S \ N键);

}

无效掉期(字符* X,字符* Y)
{
焦炭TMP;

TMP = * X;

* X = * Y;

* Y = TMP;
}
 

解决方案

我给你的算法,我曾经读过。 (一些网站)


  • 最初,排序的元素,以获得的最小排列。
  • 从右边开始,并保持向左移动,只要字母增加值让它成为X
  • 在后面的x查找大于x序列中较大的最小值X ..s ..,并用X掉它。 (让它成为S)。 (那么这将是S ..x ..)
  • 在这样做之后,反向超越S中的字母。

这就是你现在执行的算法。

 假设你有拿到1 3 4 2下一个置换
+步骤2:
1 3 4 2
  |

+步骤3:
1 3 4 2(4大于3)
  | |

1 4 3 2

+步骤-4-
扭转它
1 4 3 2 ----> 1 4 2 3
   |  -  |
 

I need a function to generate combinations in a strict order. here's an example :

{0,1,2,3} :

0 1 2 3
0 1 3 2
0 2 1 3
0 2 3 1
0 3 1 2
0 3 2 1

1 0 2 3
1 0 3 2
1 2 0 3
1 2 3 0
1 3 0 2
1 3 2 0

2 0 1 3
2 0 3 1
2 1 0 3
2 1 3 0
2 3 0 1
2 3 1 0

3 0 1 2
3 0 2 1
3 1 0 2
3 1 2 0
3 2 0 1
3 2 1 0

So,I need This particular order,not any other.I have tried a few hard-code steps to guess the algorithm,but is there an existing function that can do it for me?

UPDATE:

#include <stdio.h>
#include <string.h>

int main(void)
{
char keys[] = {'0','1','2','3','\0',};

char buffer[] = {'0','1','2','3','\0',};

printf("%s\n",keys);

Swap(&keys[2],&keys[3]);

printf("%s\n",keys);

strcpy_s(keys,sizeof(buffer),buffer);

Swap(&keys[1],&keys[2]);

printf("%s\n",keys);

Swap(&keys[2],&keys[3]);

printf("%s\n",keys);

strcpy_s(keys,sizeof(buffer),buffer);

Swap(&keys[1],&keys[3]);

Swap(&keys[2]   ,&keys[3]);

printf("%s\n",keys);

Swap(&keys[2],&keys[3]);

printf("%s\n",keys);

}

void Swap(char *x,char *y)
{
char tmp;

tmp = *x;

*x = *y;

*y = tmp;
}

解决方案

I am giving you the algorithm I once read. (from some site)


  • Initially, sort the elements to obtain the minimum permutation.
  • Begin from the right and keep moving left as long as the letters are increasing in value let it be x
  • Find the smallest value bigger than x in the sequence "x ..s.." after x and swap it with x. (let it be s). (then it will be "s ..x..")
  • Having done this, reverse the letters beyond s.

This is the algorithm that you have to implement now.

Suppose you have to get the next permutation of 1 3 4 2
+ Step-2:  
1 3 4 2
  |

+ step-3:
1 3 4 2 (4 greater than 3 )
  | |

1 4 3 2

+ step-4
reverse it
1 4 3 2 ----> 1 4 2 3
   |--|

这篇关于在生成特定的顺序组合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆