4 つの乱数 (1 から 10 まで) のリストを含む配列が与えられます。生成されたリストの 3 つの数字を追加することにより、初期リストの 4 つの数字すべてを生成できるように、3 つの数字 (1 から 10 を含む) のリストを生成することになっています。
誰かこれを行うためのアルゴリズムを提供してください。
ソリューションには 1 ~ 10 の範囲にある 3 つの数値しか含まれていないため、ここではブルート フォースが効果的なアルゴリズムです (素朴な実装でも最大 1000 の可能性をチェックできます)。したがって、C# コードは次のようになります。
public static int[] BruteForce(int[] data) {
HashSet<int> hs = new HashSet<int>();
for (int x = 1; x <= 10; ++x)
for (int y = x; y <= 10; ++y)
for (int z = y; z <= 10; ++z) {
hs.Clear();
for (int i = 0; i < data.Length; ++i)
hs.Add(data[i]);
hs.Remove(x);
hs.Remove(y);
hs.Remove(z);
hs.Remove(x + y);
hs.Remove(x + z);
hs.Remove(y + z);
hs.Remove(x + y + z);
if (hs.Count <= 0)
return new int[] { x, y, z }; // <- Solution
}
return new int[] {}; // <- No solution found
}
いくつかのテストケース:
問題セット(1 ~ 10 の範囲にある 4 つのアイテムのすべての可能なリスト) でさえ、上記で実装されたブルート フォース アルゴリズムによって解決されるほど十分に小さい (10000 アイテム)。10000 から 768 の 4 項目リストだけが 3 項目リストで生成できないことは簡単にわかります。