目次

前のトピックへ

数独は、どのようにPythonでシミュレーション環境を作るには?

次のトピックへ

詳細なプログラム:数独キット

このページ

数独にPythonプログラムを書く

我々は、手書きを使用する方法を発見したものは停止ユニークなアプローチのための世界では良い数独コンピュータシミュレーションを構築したとき、我々は再度詳しく説明するため(これは、Pythonで)コンピュータ言語にそれを回すために始めることができます。条件で、プログラミング(プログラミング)と呼ばれる。プログラミングは、では、どのように我々は問題を解決するためにコンピュータを教える方法を実行しようとしていると見ることができる。

最初に、我々は最初の数独全体の環境を解決するためのプロジェクトを紹介し、その後、我々は基本的な方法をいくつか説明します。

環境を解く

我々はまた、2つのイベントのカテゴリ、SudokuDonとSudokuErrorを定義しながら、溶液プロセスに対処するために、数独を解くこの全体の入り口を行うには解決()関数を設計し数独数独を解くかのルールに違反して条件を生成することが判明している。

ノート

例外(例外)」とは?

「(例外)例外処理は、「システムが時事問題の処理を停止し、イベントハンドラにジャンプします、条件が満たされたときに、このイベントを構成し、イベント定義である。このプロジェクトには2つの主要な例外があります。

SudokuDone:

これは数独を解決されている場合には、この例外が起こされます

SudokuError:

この例外に違反して見つかった数独のルールを解決するプロセスは起こされるいつ

To let the environment know how many methods they can use to solve a sudoku, we create a class, SolveMethod. We use this class to create all methods in a BRAIN. We can treat this BRAIN like the god of this valley. Every time, when people don’t how to choose their suitable houses, you can ask the god of valley, and it will give an answer, or it would say that, “I don’t know how to do either!

仮想脳****のために、内部に格納され、単一のSovleMethodオブジェクトに停止する方法の一人一人が、これらのオブジェクトは、次の主要な属性があります。

  1. 楽しい:Pythonの関数名独法

  2. IDX:苦労して配置順に、1つずつを開始する簡単な方法から、ソートメソッド、仮想脳は、順番に数独を解決するためにこれらのメソッドを使用します。

  3. 名前:このメソッドの名前、ユーザーが自分の名前をカスタマイズすることができます

  4. レベル:難易度、人間の直感の面で。システムは独特の困難整数全体の数をカウントロックを解除するために使用します。

解決プロセス

ここで、()を解くと、メイン解決関数であり、フローチャート。

_images/flowchart.png

ノート

** ‘便利な(作品)」または「役に立たない」(機能しない)? **

溶液法は、それがすることができることを意味し、「有用」である場合:

  1. 1つ以上の人々が彼らの家を見つけることをしましょう

  2. または家が1つ以上の国の1つ以上、人々が彼らの家に住むことができないことを知らせる

このフローチャートでは、我々は知っている:

  1. 人の居住地や家の便利セットは乗員の可能性を減らすことができるときにメソッドを解決するとき、全体の仮想脳はまず継続する解決のアプローチを解決するために戻ります。

  2. それが解決するために次の方法に転送されたときに解決法が役に立たない場合。

  3. And if final method can’t solve a game, it will go out and say “I can’t figure out this game, sorry!”
  4. (完了)数独を解くか、数独のルール(エラー)に違反されたことが判明した場合の解決プロセスを通じて、それは全体の解決環境をオフにジャンプします。

いくつかの基本的な解法

  1. fill_only_one_possible:

    各家のグループでは、すべての家をチェックし、もし唯一の家の人々は、田舎に住むことができそうであるならば、家が進出するその国の人々を維持するようにします。

  2. fill_last_position_of_group:

    ときに、グループの家ときだけ1が利用可能に、まだ収容されていない国の人々だけである必要があります。

  3. check_obvious_number:

    すでに定住し、それぞれの国の国民を確認して、それらが相互作用の影響を受けているところを見て、あなたはそれがある場合は、残りの国民は、に定住するようにできるように、家を見つけることができれば、まだブロックが滞在する国の人々が存在し、明らかにその国の人々を与えるために、家に割り当てることができます。

  4. check_inobvious_number:

    この解法とは同じcheck_obvious_numberが、彼らは他の人を検出するのに十分に一緒に定住し、まだブロックが自国民の生活しているように、最初の人々の中には、仮想ブロックを見つけること。

  1. reduce_by_group_number:

    もし人々が、他の空の家のグループ内の仮想の家と同じ方向に、それはこの国に住んでいることは不可能である家の中で、国家仮想ブロックの形成。

  2. update_chain:

    家の数が住んでし始めたとき、それは家の中には、もはやそのため、家グループ(X軸、Y軸、ブロック)内の空の家は、キーチェーンを制作できたいくつかの国の居住者を許可することができます影響を与えません。(チェーン)。この方法は、可能なキーチェーン、キーチェーン、空の家を見つけ、これらのキーチェーンに生きている自国民の潜在的な影響を軽減することである。

それを解決するためのメソッドを実装する方法?

私達はちょうど私達がcheck_obvious_for_a_country(M、NUM)として注文、人々は国がブロックけれども国の住民のための避難所を実行する検索する直感的な方法を持っているかどうかのために実装する必要があります。

 1  def check_obvious_for_a country(m, num):
 2  checked = list()
 3  for p1 in m.n[num].p:
 4      for b in m.b[p1.b].effects:
 5          possible = []
 6          if b in checked:
 7              continue
 8          else:
 9              checked.add(b)
10          if num not in m.b[b].possible:
11              continue
12          for p2 in m.b[b].p:
13              if p2.v != 0 or p2.can_see(p1) > 0:
14                  continue;
15              if not m.lineX[p2.x].allow(num):
16                  continue
17              if not m.lineY[p2.y].allow(num):
18                  continue
19              possible.append(p2)
20          if len(possible) == 1:
21              m.setit(possible[0].x, possible[0].y, num, d="Obvious For a Country People")
  1. ライン#1、解決方法を定義し、* m は世界に一人のゲームの数、* numは**可能な値は1-9である、国コードです。

  2. ライン#3は、それぞれがこの谷に住んでいる、この国の国民は、彼らの家を見つけなければなりません。

  3. ライン#4-9、すべての家をチェックすると、まだブロックがチェックされていない。

  4. ライン#10月11日、このブロックは、居住国の人々されている場合は、それがチェックされていません。

  5. ライン#12月19日、人々は田舎に住んで来ることができるように、このブロックは、すべての利用可能かどうかを確認してください。イエスならば、内部の可能な家のリストに移動します。

  6. 一度だけがある場合、行番号20〜21、可能性の最終チェックリストは、それは家がその国の人々が生きるためにバインドされていることを意味します。