SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Javaで学ぶグラフィックス処理

数字パズルを半自動的に解くプログラムの作成

入力可能な場所をガイドするアシストプログラム

  • X ポスト
  • このエントリーをはてなブックマークに追加

プログラムの使い方

 アプレットを実行すると、上方左に[取消]、[1]、[2]、……、[9]のラジオボタンが並んで表示されます。数字を入力するには、あらかじめこのボタンを選択しておき、グリッド内の希望するマスをクリックします。

 その右には、[出題]、[解答]、[試行]のラジオボタンがあり、これでモードを切り替えます。さらに右には、[全クリヤ]、[解答クリヤ]、[試行クリヤ]のボタンが並んでおり、入力した数字のクリヤに使用します。各マスには小さな数字で、そこへ入力可能な数字が示されています。

 アプレットを立ち上げた直後には、サンプル問題が出題されていて、「解答モード」になっています。ラジオボタンを[取消]から入力したい数字に変えて、このプログラムを試してみてください。

出題モード

 新規に問題を入力するモードです。

 まず、[全クリヤ]ボタンで問題を消去します。すると自動的に「出題モード」になりますので、問題集などを見ながら、例えば、ラジオボタン[1]を設定して「1」を入れるべきマスをクリックします。すると、黒色の書体で数字が入力されます。次に[2]を選択して「2」を入力します。入力の順番は任意です。

 間違えて入力した場合には、正しく入力したい数字のラジオボタンを選択し、上書きすることができます。消去したい場合には、ラジオボタン[取消]を選択します。グレイ色の部分には入力できません。

解答モード

 問題を間違いなく入力したら、ラジオボタン[解答]を選択して、「解答モード」に移ります。

 ここでは、ラジオボタン[1]から[9]までを順次繰り返して選択し、入力可能な場所(後述の「数字入力のルール」を参照してください)があれば、そこでクリックします。すると、青色のイタリックで数字が入力されます。この数字入力も、上書きやラジオボタン[取消]で訂正できますが、解答入力を慎重にやれば、訂正の必要は滅多にありません。全体を訂正したい場合には、[解答クリヤ]ボタンをクリックして、解答入力全部を取り消すことができます。

 「解答モード」は、このプログラムの最も楽しめるところです。安易に次の「試行モード」に移らないで、じっくりと数字パズルの楽しさを満喫してください。ラジオボタン[1]から[9]までの順次繰り返しは、十分な回数を必要とします。中級レベルのほとんど、上級レベルの比較的易しいものは、この「解答モード」だけで十分解けます。

試行モード

 どうしても残りの空欄を埋めることができなくなったら、ラジオボタン[試行]を選択して「試行モード」に移ります。このモードで入力すると、数字が赤色のイタリックで表示されます。これらの数字は、[試行クリヤ]ボタンで容易にクリヤできますので、何度でも試行錯誤することができます。どのようになったら失敗なのかは後述します(図4参照)。

数字パズル解法のルール

 ルールと言っても、コンピュータが自動的に実行するのではなく、ユーザーが自分の意思で入力しますので、一応これに従っていれば解答が得られるという意味です。以下に示すものは一例で、他にもいくつかのルールがあります。興味ある方は研究してください。

一箇所だけ空欄がある場合

 3×3のサブマトリックス、横列、縦列いずれかに、一箇所だけグレイ表示されていない空欄があれば、そこが新規に入力する場所です。入力すべき数字を1から9まで何回も繰り返して埋めてゆきます。これだけで、初級の問題は十分解けます。

 図1は、入力すべき数字が「1」(ラジオボタン[1]が選択されている)の時に現れた画面の例です。白い空欄が3×3のグリッドの中に1個(右中央)しかありませんので、この場所が「1」の入るべき場所です。ここでクリックすると「1」が入ります。空欄が2個以上ある場合には、十分な理由がない限りどれかをクリックしてはいけません。

図1 サブグリッドに1個だけ空欄がある場合
図1 サブグリッドに1個だけ空欄がある場合

 図2は横列の場合を示します。入れるべき数字が「9」の時の画面の例です。白い空欄が左から3番目のマスのみですから、ここでクリックすると、そこに「9」が入ります。

 縦列に1箇所だけ空欄がある場合でも同じです。

図2 横列に一個だけ空欄がある場合
図2 横列に一個だけ空欄がある場合

入力可能な数字の候補が2個で、同じ組み合わせが2箇所にある場合

 図3は少し高度な例です。「2 4」の可能な組み合わせが、同じ横列に2箇所あり、「2」と「4」は必ずこの2箇所に入ります。従って、一番左のマスに「4」が入ることはありません。従って、一番左には「8」が入ります。ラジオボタン[8]を選んで、この場所に「8」を入れましょう。このほか、「2 4」「2 4」「2 4 6」とある場合は、「2 4 6」のマスには「6」が入ります。

図3 入力可能な組み合わせが二箇所にある場合
図3 入力可能な組み合わせが二箇所にある場合

「試行モード」で失敗の場合

 試行モードで数字入力を続けて行くと、図4のような状態に遭遇することがあります。白い空欄がなく、入力候補の数字のないマスが3箇所もあります。これは、エラーが発生したのです。これらは、今までの入力に誤りがあったことを示しています。[試行クリヤ]ボタンで、試行による入力をクリヤしてください。

図4 「試行モード」での失敗の例
図4 「試行モード」での失敗の例

プログラムの実行結果

 図5は、実行画面の全体を示したものです。あらかじめ準備されている(アプレット起動時に読み込まれる)問題をそのまま使用し、「解答モード」にして、数字「7」を入力できる場所を探しているところです。左上と下中央のサブグリッドに入力できます。これらのサブグリッドで白い空欄をクリックすると、そこへ数字「7」が青色のイタリックで入ります。

図5 実行画面のラジオボタン、ボタンの配置
図5 実行画面のラジオボタン、ボタンの配置

 図6は、解答入力が進んだ状態を示します。もう入力できる場所がないと思うかもしれませんが、よく注意して見てください。まだまだあります。

図6 「解答モード」で解答入力が進んだ状態
図6 「解答モード」で解答入力が進んだ状態

 図7は、図6の状態から、意図的に「試行モード」に移って、ある程度のカンを働かせながら(論理的ではない)試行の数字を入力(赤色)した結果を示しています。幸いに、一回の試行で完全な解答に到達することができました。

図7 「解答モード」と「試行モード」を使用して解答が得られた状態
図7 「解答モード」と「試行モード」を使用して解答が得られた状態

まとめ

 数字パズルが流行し、プログラム愛好家の格好のターゲットとなって、数多くの優れたソフトがネット上に提供されています。多くは、バックトラッキング法を用いて自動的に解くもので、プログラマには面白くても、数字パズルファンにとっては面白くありません。本稿は、プログラム的には価値のやや低いものですが、数字パズルを解く楽しみをユーザーに与えることを目標にしました。これによって数字パズルの愛好家が増えれば幸いです。

 なお、ここで使用した数字パズルの問題は、筆者が考えたものです。専門家による作品と比べると幼稚なものでしょうが、中級の易しい部類に属し、「解答モード」だけで容易に解けます。

 このプログラムを使用した感想があれば、ぜひコメントしていただけると幸いです。「もっとここを改良したら」「便利なので今後活用したい」「邪道なのであまり使いたくない」など、何でも結構です。

 面白い改良案などがあれば、ご投稿もお待ちしております(編集部)。

参考資料

 数字パズルの歴史から解法まで、すべて下記から調べることができます。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Javaで学ぶグラフィックス処理連載記事一覧

もっと読む

この記事の著者

石立 喬(イシダテ タカシ)

1955年東京工大卒。同年、NECへ入社し、NEC初のコンピュータの開発に参画。磁気メモリ、半導体メモリの開発、LSI設計などを経て、1989年帝京大学理工学部教授。情報、通信、電子関係の教育を担当。2002年定年により退職し現在に至る。2000年より、Webサイト「Visual C++の勉強部屋」を公開。...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/539 2006/10/05 00:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング