Logic Puzzle の解法

通勤電車の中で Logic Puzzle の本を広げて懸命に鉛筆でマークしている人を時々見かけますが、 DLL の作成でもその考え方をプログラムに組み込みます。

前田稔(Maeda Minoru)の超初心者のプログラム入門

  1. マークの無い行(列)には、全て空白を設定します。
            ・・・・・・・・・・・・
    
            □□□□□□□□□□□□
    
  2. 行(列)と同じ数値が割り当てられているときは、全てをマークします。
        12  ・・・・・・・・・・・・
    
            ■■■■■■■■■■■■
    
  3. 左に詰めたときと右に詰めたときで重なる部分にマークします。
       5 4  ・・・・・・・・・・・・
    
       5 4  ・・■■■・・・■■・・
    
  4. マークの左が空白または端のときは、そのマークを確定できます。
       5 4  ・□■■・・・・・・・・
    
       5 4  ・□■■■■■□・・・・
    
  5. マークの右が空白または端のときは、そのマークを確定できます。
    但し、マークが一件かまたは、割り当てが確定しているときに限ります。
       3 5  ・・・・・・・・■■□・
    
       3 5  ・・・・□■■■■■□・
    
  6. 最大長と同じ長さのマークは確定できます。
      3 2 1 ・・・・■■■・・・・・
    
      3 2 1 ・・・□■■■□・・・・
    
  7. 全ての割り当てが同じ長さで、マークの片方が空白または端のときは確定できます。
      2 2 2 ・・・□■・・・・・・・
    
      2 2 2 ・・・□■■□・・・・・
    
  8. マーク長より短い NULL は空白にできます。
      3 4   □□・・□・・・・・・・
    
      3 4   □□□□□・・・・・・・
    
  9. 前方にマークの余地が無く、連結が必然のときです。
      5 1   ・・・■・■・・・・・・
    
      5 1   ・・・■■■・・・・・・
    
  10. マークの割り当てが一件で、マークを連結する場合です。
       4    ・・・・・■・■・・・・
    
       4    ・・・・・■■■・・・・
    
  11. 先頭にマークの余地が無く、先頭から空白を設定できる場合です。
      5 1 2 ・・・・■■■・・・・・
    
      5 1 2 □□・・■■■・・・・・
    
  12. 先頭にマークの余地が無く、マークを延長できる場合です。
      5 1 2 ・・■・・・・・・・・・
    
      5 1 2 ・・■■■・・・・・・・
    
  13. 割り当てられたデータが1件で、マークがあるとき余白に空白を設定します。
       3    ・・・・・■・・・・・・
    
       3    □□□・・■・・□□□□
    
  14. 余白と次のマークの関係で、先頭マークが確定します。
    連結すると長くなり、4 は前から確定です。
      4 2   ・■■■・■■・・・・・
    
      4 2   ■■■■□■■□・・・・
    
  15. 余白の関係で、二番目のマークが確定できます。
    余白に 1 2 が入る余地が無く 2 が確定できます。
     1 2 3  ・・・■■・・・・・・・
    
     1 2 3  ・・□■■□・・・・・・
    
  16. 余白にマークを追加したとしても、同じ長さで確定できます。
     1 1 4  ・・■・・・・・・・・・
    
     1 1 4  ・□■□・・・・・・・・
    
  17. 空白にしないと矛盾するときです。
     1 2 4  ・・■・■■・・・・・・
    
    これではマークが一致しません。
     1 2 4  ・・■■■■・・・・・・
    
     1 2 4  ・・■□■■・・・・・・
    
  18. 先頭マークと対応させると次のマークが確定するときです。
    先頭の2個のマークが4に対応するので、後のマークは2で確定です。
     4 2 2  ・■■・・・・■■・・・
    
     4 2 2  ・■■・・・□■■□・・
    
  19. 一番短いマークに合わせて延長できるときです。
     4 4 3  ・・・□■・・・・・・・
    
     4 4 3  ・・・□■■■・・・・・
    
  20. これ以外にありとあらゆる解法をプログラムに組み込んで行くのですが、次から次へと解けないケースが表われます。
    最後には「どう考えてもそこから進めようが無い」と思われる問題が存在します。
    そこを乗り越えなければ Logic Puzzle のプログラムが完成したとは言えません。
    DOT のフォルダーに格納されている問題の半分ぐらいが解けるころには、彼方のプログラム能力は随分向上していることでしょう。
    このような問題をパズルを解くときと同様に「楽しみながら考える力」がプログラマには必要です。

[Next Chapter ↓] 問題ファイルの作成
[Previous Chapter ↑] Logic Puzzle Object Class の説明

超初心者のプログラム入門(Win32API C++)