这看起来像一个递归工作(可能不是最有效的,但肯定是最简单的解决方案,如果你的数据是这个小它不应该的问题):
var check = function(input, colors) {
if (!input.length) {
return true;
}
var input_color = input.pop();
var ok = false;
for (var i = 0; i < colors.length; i++) {
var color = colors[i];
if (!color) {
break;
}
if (color.indexOf(input_color) !== -1) {
colors.splice(i, 1);
ok = check(input, colors);
if (!ok) {
colors.splice(i, 0, color);
} else {
break;
}
}
}
if (!ok) {
input.push(input_color);
}
return ok;
};
与用法:
var colors = [
['white', 'blue'],
['green', 'yellow'],
['black'],
['yellow', 'blue', 'pink'],
['orange', 'red'],
['brown', 'white']
];
check(['white', 'blue', 'pink', 'black', 'orange', 'yellow'], colors);
注意,它会同时改变colors
和inputs
阵列(你每次调用check
时间,使它们的副本)。
其实这个问题跟路径发现问题很相似。这是一个强力解决方案。
有什么想法?只有2个嵌套循环与'if'? – zerkms
这是一个家庭作业吗?听起来像是一项家庭作业。 – Posthuma
问题是颜色重复,只能从每个数组中选择一个。不,不是家庭作业。这是一个在线游戏,我只是用颜色来使问题更容易。 –