3

私はこれに対する解決策を見つけるのに苦労しています。

それぞれに 1 ~ 3 色の 6 つの色の配列があり、色を繰り返すことができるとします。

['white', 'blue']
['green', 'yellow']
['black']
['yellow', 'blue', 'pink']
['orange', 'red']
['brown', 'white']

そして、ユーザーは、たとえば、白、青、ピンク、黒、オレンジ、黄色の 6 色を入力します。これらのすべての色が配列の一部であり、各配列から 1 つだけを選択できると仮定して、すべてを選択できることを確認するにはどうすればよいですか。

私の質問が理解できることを願っています。

編集:質問を言い換える

上記のように 6 つの色の配列があり、ユーザーは各配列から 1 つを選択する必要があります。ユーザーが送信した順序が配列の順序ではないと仮定して、ユーザーの入力が正しいことを確認するにはどうすればよいですか。

4

1 に答える 1

2

これは再帰の仕事のように見えます (最も効率的ではないかもしれませんが、間違いなく最も簡単な解決策であり、データがこれほど小さい場合は問題になりません):

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);

と の両方colorsinputs配列が変更されることに注意してください ( を呼び出すたびにそれらのコピーを作成する必要がありますcheck)。

実際、この問題はパス検索の問題とよく似ています。そして、これは力ずくの解決策です。

于 2013-07-18T23:26:47.900 に答える