如何获得2xn矩阵的所有可能组合

时间:2016-01-31 18:02:59

标签: c

我无法解决这个问题,尝试了很多但逻辑不起作用。 问题是, 我必须计算2 x N矩阵的所有可能组合。 条件:

  • 所有元素的总和必须为N。
  • 行或列中的元素必须以不增加的方式。
  • 所有元素必须是正数和实数。 打印所有可能的组合。 让6,它是29 感谢。

1 个答案:

答案 0 :(得分:-4)

已经问过这个问题,
你可以使用回溯来解决它 这是代码,

#include<conio.h>
#include<stdio.h>
int a[2][100],c,sum,num;
int ch;
int check(int x,int y)
{
    int i=1;
    if(x==1&&a[x][y]>a[0][y])
    i=0;
    if(y>0&&a[x][y]>a[x][y-1])
    i=0;
    return i;
}
void print()
{
    int i,j;
    printf("\n");
    for(i=0;i<2;i++)
    {
        for(j=0;j<num;j++)
        printf("%4d",a[i][j]);
        printf("\n");
    }
}
void fun(int lim,int x,int y)
{
    int i;
    if(y<num)
    for(i=lim;i>0;i--)
    {
        a[x][y]=i;  
        if(check(x,y))
        {
            sum+=a[x][y];
            if(sum==num)
            {
                print();
                sum-=a[x][y];
                a[x][y]=0;
                c++;
            }
            else
            {
                fun(num-sum,(x+1)%2,y+(x+1)/2);
                a[(x+1)%2][y+(x+1)/2]=0;
                fun(num-sum,(x+2)%2,y+(x+2)/2);
                a[(x+2)%2][y+(x+2)/2]=0;
            }
            sum-=a[x][y];
        }
    }
}

int main()
{   
    scanf("%d",&num);//num=6
    fun(num,0,0);
    printf("%d",c);
    return 0;
}