2012-04-28 10 views
5

ペイントするボードはN x Mです。一度に行全体または列全体をペイントすることができます。すべてのボード・セルの色のN x Mマトリックスが与えられていると、ボードを塗装する最小の塗装操作数を見つけることができます。プログラミングパズル:ボードをペイントする方法は?

B、B、B
B、R、R
B:

例えば:( - 赤、B - - G、青、緑R)次のように我々は、3×3のボードを描くべきです、塗装作業のG、G

最小数は4:

    レッドブルー
  • ペイント行1
  • ペイント行0ブルー

グリーン

  • ペイント列0と
  • ペイント行2どのようにそれを解決するのでしょうか?

  • +0

    あなたはより多くの背景を与えることができますか?特に予想されるボードサイズは何ですか?あなたはどんな複雑さを期待していますか? – amit

    +0

    @amitはい、そうです。ボードは最大で50 x 50で、色数は最大で10です。 – Michael

    +0

    実現可能性については何かを述べるべきです。明らかに、どこでも同じ色の単一行または列のないボードは解決できません。 – flodel

    答えて

    3

    初心者は、となっています()。

    G=(V,E)V = {all possible boards}E = {(u,v) | you can move from board u to v within a single operation}のようになります。あなたはその場でそれを生成することができ、与えられたボードのすべての後継者を返すsuccessors(board)機能を使用して - あなたは事前にグラフを生成する必要はありません

    • 注意。

    またh:V->Rが必要になります - ボードを評価admissible heuristic function

    A*またはbi-directional BFS検索[またはその両方の組み合わせ]を実行すると、ソースがホワイトボードになり、ターゲットが要求されたボードになります。許容できるヒューリスティック関数を使用するため、A *はcomplete(常に存在する場合は解を見つける)とoptimal(最短解を見つける)の両方であり、最良の解を見つけることができます。 [双方向BFSの場合も同じです。]

    欠点:

    • アルゴリズムが通知されますが、それは指数関数的な振る舞いを持つことになります。 しかし、面接の質問であれば、私は非効率な 解決策が解決策ではないと信じています。
    • 解決策がない場合は完全で最適ですが、アルゴリズムは無限ループに固定されているかもしれません。許容ヒューリスティックため

    (1)の例では、これは楽しみの問題のように見えるh(board) = #(miscolored_squares)/max{m,n}

    6

    です。私はいくつかの擬似コードでそれを撮影してみましょう。

    Function MinPaints(Matrix) Returns Integer 
        If the matrix is empty return 0 
        Find all rows and columns which have a single color 
        If there are none, return infinity, since there is no solution 
        Set the current minimum to infinity 
        For each row or column with single color: 
         Remove the row/column from the matrix 
         Call MinPaints with the new matrix 
         If the result is less than the current minimum, set the current minimum to the result 
        End loop 
        Return the current minimum + 1 
    End Function 
    

    私はあなたの問題を解決すると思いますが、私は最適化など何も試していません。これは十分に速くないかもしれませんが、わかりません。私は、この問題がサブ指数関数的な時間で解けることを疑う。ここで

    は、このアルゴリズムは、例を解決する方法を次のとおりです。

    BBB 
    BRR 
    BGG 
    | 
    +---BRR 
    | BGG 
    | | 
    | +---RR 
    | | GG 
    | | | 
    | | +---GG 
    | | | | 
    | | | +---[] 
    | | | | | 
    | | | | Solvable in 0 
    | | | | 
    | | | Solvable in 1 
    | | | 
    | | +---RR 
    | | | | 
    | | | +---[] 
    | | | | | 
    | | | | Solvable in 0 
    | | | | 
    | | | Solvable in 1 
    | | | 
    | | Solvable in 2 
    | | 
    | Solvable in 3 
    |      BB 
    +---Another branch with RR ... 
    |      GG 
    Solvable in 4 
    
    +0

    '結果が-1の場合は-1を返します。これが正しいかどうかわからないのは、この特定の分岐が解決されないことを意味しますが、別の分岐がある可能性があります(forループの後半で検出されます)正しい解決策につながるでしょう。 [解がないときはINFINITYを返し、他の結果のように扱うことで解決できます] – amit

    +0

    あなたは正しいかもしれませんが、そのような状況がどうなるか把握できません。私はそれができない気がする。 –

    +0

    INFOITYのソリューションは、特別なケースハンドリングを必要としないためより洗練されていますが、IMO :) – amit

    関連する問題