我正在努力解决以下问题。
想象一下,我有6个糖果,我必须给这些糖果分配6个孩子,而每个孩子都不能超过2个糖果。
示例: 000222 121020
我需要实现的是按字典顺序查找所有可能的解决方案,因此对于与上述相同的示例,它会像这样。
000222 001122 001212 001221
我写了一个算法来创建一个基本的解决方案,它将给我第一个字典上的解决方案(在上面的例子中,它会给我结果000222),然后我写了另一种算法,它总是在字典上找到我的下一个解决方案命令,因此,如果我向该算法发送000222,它将给我001122。
我的问题是我的算法无法正常运行,这是我在需要此类算法时编写算法的方式:
console.log(nextSchedule("001221"))
当正确答案为002022时,它会给我002121。我理解为什么我的算法会这样做,但是我不知道如何进行改进才能处理这些情况。
我正在按原样发送nextSchedule算法。
有人可以给我一些指导使其工作吗?
谢谢!
function nextSchedule(currentSchedule) {
let newSchedule = currentSchedule.split('');
for (let i = newSchedule.length - 1; i > 0; i--) {
if (newSchedule[i] > newSchedule[i - 1]) {
newSchedule[i]--;
newSchedule[i - 1]++;
break;
}
}
newSchedule = newSchedule.join('');
return newSchedule === currentSchedule ? null : newSchedule;
}
答案 0 :(得分:0)
建议:假设您的目标是产生所有可能的数字000000到222222,其中每个数字的范围只能是0到2。您的方法将通过输入数字,然后在最右边的数字加1来实现。如果结果大于2,则将其环绕到0,然后将1移到紧靠左边的数字上。重复直到没有结转。
(这就像您要在纸上添加两个数字,只是停在2而不是9)。
但是,您现在有一个附加的约束:您只希望给出总共六个糖果的数字(即:数字中所有数字的总和为6)。因此,请添加该签入内容-如果“下一个”数字加起来不等于6,则只需继续重复该过程,直到找到一个数字即可。
基本上,您将遍历所有729个6位以3为底的数字,但扔掉不符合您条件的数字。