回 帖 发 新 帖 刷新版面

主题:如何实现这个问题?

一个很有意思的问题,貌似很简单,但是我自己确实没想出来,看来也不是太简单啊。希望高手给出个算法,


有2N个不同的数,如k1,k2,k3.....k2N, 将其分为N对,(k1',k2')....(k2N-1',k2N'),如何实现呢? 
如果N=2  
1 2 3 4--》(1,2),(3,4)|(1,3),(2,4)|(1,4),(2,3);
如果N=3
(1,2)(34)(56)
(1,2)(35)(46)
(1,2)(36)(45)
(1,3)(24)(56)
(1,3)(25)(46)
(1,3)(26)(45)
(1,4)(23)(56)
(1,4)(25)(36)
(1,4)(26)(35)
(1,5)(23)(46)
(1,5)(24)(36)
(1,5)(26)(34)
(1,6)(23)(45)
(1,6)(24)(35)
(1,6)(25)(34)

如果N取任意的数呢?
谢谢啦。

回复列表 (共11个回复)

11 楼

改进了一下,用递归算法做的,理论上支持n=255以内所有的数,不过算到6以上就已经很吃力了
#include <stdio.h>
#include <conio.h>

int num = 0;
int Arrange(int a[255],int n,int n1,int x[255]);
void DisPlay(int a[255],int m,int n);
void PrintfData(int a[255],int n);
void IfPlus(int x[255],int n);

void main(void)
{
    int n,i;
    int a[255],x[255] = {0};
    printf("请输入N的取值:");
    scanf("%d",&n);
    while(1)
    {
        if(Arrange(a, n, n, x))
            break;
    }
    printf("共有%d组",num);
    getch();

}

int Arrange(int a[255],int n,int n1,int x[255])
{
    int m,p = 0;
    if (n == 1)
    {
        for (m = 0; m < 2*n1; m++)
        {
            a[m] = m + 1;
        }
    }else
    {
            p = Arrange(a, n - 1, n1, x);
            if(p == 1)
                return 1;
            
            if(n == 2 && x[n] == 2*n - 1)
            {
                return 1;
            }
            
            if (n == n1)
            {    
                
                x[n]++;
                IfPlus(x,n);
            }
            DisPlay(a, 2*n - 1, 2*n - 1 - x[n]%(2*n - 1));
            if (n == n1)
            {
                PrintfData(a,n1);
                num++;
            
            }
            return 0;
        
    }    
}
        
    
void IfPlus(int x[255],int n)
{
    if(n == 2)
        return;
    if (x[n] % (2*n - 1) == 0 && x[n] != 0)
    {
        x[n - 1]++;
        IfPlus(x, n - 1);
    }
    
}

void DisPlay(int a[255],int m,int n) //将a数组的倒数第m个数据与第n个调换位置
{
    int i;
    i = a[m - 1];
    a[m - 1] = a[n - 1];
    a[n - 1] = i;
}

void PrintfData(int a[255],int n) //打印函数
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("(%d %d)",a[2*i],a[2*i + 1]);
    }
    printf("\n");
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册