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