Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 基于2个变量的组合_C_Combinatorics - Fatal编程技术网

C 基于2个变量的组合

C 基于2个变量的组合,c,combinatorics,C,Combinatorics,我试图实现的是对以下内容进行功能化: 假设我有1-9个正方形。这些正方形有一个全局分配的编号,而不是单独分配的编号。它们就像一个集合,这个集合有这个数字 例如:19 我想做的是一个函数,它根据正方形的数量和与之相关的数字给出可能的组合。对于上面的示例:9、8、2是可能的组合之一。然而,我只想要这些组合中的数字,而不是组合本身。另外,它们必须是唯一的(不应该是9,9,1)。哦,这些数字的范围仅为1-9 如何在C中实现这一点?如果你想知道这是一个益智游戏 提前谢谢 看起来您正试图在右侧找到整数的限制

我试图实现的是对以下内容进行功能化:

假设我有1-9个正方形。这些正方形有一个全局分配的编号,而不是单独分配的编号。它们就像一个集合,这个集合有这个数字

例如:19

我想做的是一个函数,它根据正方形的数量和与之相关的数字给出可能的组合。对于上面的示例:9、8、2是可能的组合之一。然而,我只想要这些组合中的数字,而不是组合本身。另外,它们必须是唯一的(不应该是9,9,1)。哦,这些数字的范围仅为1-9

如何在C中实现这一点?如果你想知道这是一个益智游戏


提前谢谢

看起来您正试图在右侧找到整数的限制值。该链接应该为您提供一个良好的起点,您应该能够找到一些算法,这些算法可以将整数划分为任意数量的部分。

听起来您正在研究的内容与kakuro非常相似,也称为交叉和:

有一些生成器可用于这些类型的谜题,例如:


我猜想大多数kakuro生成器都必须解决您的确切问题,因此您可能会从中得到一些启发。

在组合数学中,我们说“顺序不重要”,意思是“我只想要一组数字,而不是一个特定的顺序”

//将给定的数字数组设置为包含求和的“第一”组数字
void firstcomposition(整数位数[],整数位数,整数和){
重置(数字,0,1,numDigits,总和);
}
//修改数字数组以包含具有相同总和的“下一个”数字集。
//当没有更多组合时返回false
整数下一个组合(整数位数[],整数位数){
int i;
int=0;
剩余整数=0;
对于(i=numDigits-1;i>0;i--){
剩余+=位数[i];
如果(数字[i]-数字[i-1]>1){
如果(发现不同的| |位[i]-位[i-1]>2){
数字[i-1]++;
剩余--;
打破
}否则
结果:1;
}
}
如果(i==0)
返回0;
否则{
重置(数字,i,数字[i-1]+1,numDigits-i,剩余);
返回1;
}
}
//firstCombination和nextCombination的助手方法
无效重置(整数位数[],整数关闭,整数最小值,整数numDigits,整数和){
int i;
剩余整数=总和;
对于(i=0;i=off;i--){
如果(剩余>=当前数字-数字[i]){
剩余-=当前数字-数字[i];
数字[i]=当前数字;
当前数字--;
}否则{
数字[i]+=剩余;
打破
}
}
}

那么,框中的数字必须与末尾的数字相加?这是正确的!但是,必须考虑所有可能的组合,并返回数字。我希望我说清楚了。如果你不懂其他的东西,请告诉我。订单相关吗?e、 例如,(9,8,2)和(2,8,9)都应该是答案吗?@konforce否,但答案只是这些组合中的数字,而不是实际的组合。
//Sets the given digit array to contain the "first" set of numbers which sum to sum
void firstCombination(int digits[], int numDigits, int sum) { 
    reset(digits, 0, 1, numDigits, sum);
}

//Modifies the digit array to contain the "next" set of numbers with the same sum.
//Returns false when no more combinations left
int nextCombination(int digits[], int numDigits) {
    int i;
    int foundDiffering = 0;
    int remaining = 0;
    for (i = numDigits - 1; i > 0; i--) {
        remaining += digits[i];
        if (digits[i] - digits[i - 1] > 1) {
            if (foundDiffering || digits[i] - digits[i - 1] > 2) {
                digits[i - 1]++;
                remaining--;
                break;
            } else
                foundDiffering = 1;
        }
    }
    if (i == 0)
        return 0;
    else {
        reset(digits, i, digits[i - 1] + 1, numDigits - i, remaining);
        return 1;
    }
}

//Helper method for firstCombination and nextCombination
void reset(int digits[], int off, int lowestValue, int numDigits, int sum) {
    int i;
    int remaining = sum;
    for (i = 0; i < numDigits; i++) {
        digits[i + off] = lowestValue;
        remaining -= lowestValue;
        lowestValue++;
    }
    int currentDigit = 9;
    for (i = numDigits + off - 1; i >= off; i--) {
        if (remaining >= currentDigit - digits[i]) {
            remaining -= currentDigit - digits[i];
            digits[i] = currentDigit;
            currentDigit--;
        } else {
            digits[i] += remaining;
            break;
        }
    }
}