目次

SudokuStudyLib

_images/logo.jpg

**これは、学生が基本的なプログラミングロジックを学習するとPythonのOOPがのpython3ライブラリを設計するための機会です。 *数独パズルゲームだけでなく、ロジックを学ぶための最高のツールの一つであり、Pythonは世界最高のコンピュータ·プログラミング言語を学ぶ初心者のためである。私たちは子供たちを教えるために2を組み合わせることができますので、もし、学生は、若い人たちがロジックを学び、それが最高の組み合わせになります!これは、このプロジェクトの起源であり、それはこのプロジェクトの目標です。

人類の最も簡単なの世界へようこそ:数独、ロジック

内容:

インストールと使用

このプロジェクトは、ユーザーはPythonプログラミングロジックとデザインを学ぶことを可能にするPythonのライブラリです。それは、一方が他方が行列数独、ある2つのパッケージが含まれています。数独は、モジュラーオブジェクト指向プログラミングであり、マトリックスは、従来のプログラミングモジュールである。

このプロジェクトは限りファイルを使用するために数独キットに提供される。伝統的なプログラムへの参照を行うため、設計者だけが利用できる行列。

インストール

あなたは、PIP、このプロジェクトをインストールを使用することができます:

pip install SudokuStudyLib

また、プロジェクト全体をコピーするには、以下のWebサイトにアクセスすることができます:

https://github.com/RobertOfTaiwan/SudokuStudyLib

あなたがインストールしているときは、ディレクトリは2つのパッケージ数独と行列が含まれているインストールする必要があります。ここでは、テーブル全体のディレクトリ構造は次のとおりです。

_images/p1.png

使用

  1. オブジェクト指向:数独、test.py中:

    from sudoku import *
    
    # to solve a sudoku defined in data directory
    solve("m18.data")
    
    pass
    
    # to solve a sudoku and just using the methods which level <= 15 and if can't solve, don't use guess method
    solve("m3.data", level_limit=15, use_try=False)
    
    pass
    
    # to solve a sudoku with emulator methods and print the steps
    solve("m12.data", use_emu=True, print_step=True)
    
    pass
    
    # to solve the world's best difficult sudoku
    # by default method
    solve("m10.data")
    
    # by computer's try error
    try_error(None, file="m10.data")
    
    # by all methods but not using human guessing, it can't solve the sudoku
    solve("m10.data", use_emu=True, use_try=False)
    
    # by basic human methods and guess
    solve("m10.data", level_limit=10, use_try=True)
    solve("m10.data", level_limit=3, use_try=True)
    
  2. 伝統的な方法:マトリックス、test.py中:

    from matrix import *
    
    # solve it directly
    m, n, p = main("m6.data")
    
    # solve it by limit methods, it can't solve the sudoku
    m, n, p = main("m3.data", methods=8)
    
    # set the limit methods to the 10, and it can solve the sudoku
    m, n, p = main("m3.data", methods=10)
    
    # using the try error's method to solve the best difficult sudoku in the world
    m, n, p = TryError("m10.data")
    

数独 (数独) の基礎

数独 (数独) は、心のゲーム、最良のツールはロジックの種類。 Python は、世界で最高のプログラミング言語の 1 つです。 子供やティーンエイ ジャーは、ロジックを学ぶために教えるために両方のツールを混在させることができる場合は、最高の組み合わせです。 これは、プロジェクトとプロジェクトの目標の原点です。

典型的な数独トピック

你可以從下列網站取得與學習數獨(sudoku)的相關知識:http://en.wikipedia.org/wiki/Sudoku

以下は、典型的な数独のタイトルです。

 

ここでは、典型的な数独を解決します。

sudoku_init   sudoku_result

基本的なルール

数独 (数独) は、基本的なルールは非常に簡単です:

  1. 1-9 (x 方向と y 方向を含む) それぞれの行を埋めるために、すべての 3 x 3 チャンクを数します。

  2. 各行および各ブロック番号を繰り返すことはできません。

9 × 9 数独に可能なゲームの数を形成することができますか?

我々 はいくつかの配置の位置 (1, 1) に開始、9 桁の数字が私たちの選択があることになります。 その後、我々 は 8 桁の数字は 2 番目の数字 (1、2) の位置に配置する場合を選択するとします。 だから、類推、上から下、左から右、我々 書き留めることができる各位置の番号を選択できます。

9 !

6 !

3 !

6 !

3 !

1 !

3 !

1 !

1 !

9 6 3 6 3 1 3 1 1
8 5 2 5 2 1 2 1 1
7 4 1 4 1 1 1 1 1
6 3 1 3 1 1 1 1 1
5 2 1 2 1 1 1 1 1
4 1 1 1 1 1 1 1 1
3 1 1 1 1 1 1 1 1
2 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1

したがって、すべての組み合わせは 9 ! * 6 ! * 3 ! * 6 ! * 3 ! * 1 ! * 3 ! * 1 ! * 1 * = 4,514,807,808,000

我々 の計算に Python を使用する場合:

>>> def n(x):
    if x==1:
        return 1
    else:
        return x*n(x-1)

>>> n(9)*n(6)*n(3)*n(6)*n(3)*n(1)*n(3)*n(1)*n(1)

数独の数学 http://en.wikipedia.org/wiki/Mathematics_of_Sudoku を取得する次の web サイトに行くことができます。

「論理」とは何ですか?

学生の世界を探検するために学習を開始するために、ロジックは、最も重要なツールです。ジックは、最も重要なツールです。

最も基本的な論理が”yes”と “no”、または内部のコンピュータサイエンス「0」である二分法、「1」である。これは人間の認知の最小分類上の他の人とのコミュニケーションです。それはすべての知識の基盤は、すべての宗教の基礎であるであるため、そのように学習する児童生徒の論理は非常に重要です。るであるため、そのように学習する児童生徒の論理は非常に重要です。

ビューの特定のポイントに応じて、特定の時間に、あなたは事を判断できない場合は、「はい」または「いいえ」、または「存在」または、あなたはこの世界を理解していない、「存在しない」があるあなたは自分自身を知らない。 * **

数独のロジックから学ぶこと

我々は数独は非常に楽しいゲームですが、その後、ゲームから学ぶために行くことができれば、学習ロジックが、面白いことに変換することができます。私たちは、数独ロジックに学習に多くの利点を挙げることができる。独ロジックに学習に多くの利点を挙げることができる。

  • そのルールはかなり単純であり、誰でも5分以内にそれを理解することができます。そのルールはかなり単純であり、誰でも5分以内にそれを理解することができます。

  • それはまた、組み合わせの数十億まで持つことができ、十分に複雑。それはまた、組み合わせの数十億まで持つことができ、十分に複雑。

  • それは人々の異なるレベルを使用することができる可能にするために、難易度の異なる種々であり得る。にするために、難易度の異なる種々であり得る。

Pythonプログラミングロジックを学ぶことを学ぶ

コンピュータ言語を学ぶことは、ロジックを学ぶのに非常に直感的な方法です。 Pythonは、プログラムの設計を実装するための簡単な方法を提供し、解釈コンピュータ言語です。 https://www.python.org/:ここでは、すべてのリソースの言語の公式ウェブサイトにコンピュータを得ることができます。私たちのFAQから Pythonは初心者のための適切なプログラミング理由を理解するためにいくつかのクリップ:由を理解するためにいくつかのクリップ:

問題:

初心者のために設計されたプログラムでは、Pythonは良い選択です?選択です?

回答:

はい。

今、学生がプログラムを学ぶために始めたとき、またはこのようなC + +のパスカル、C、などの従来のコンピュータ言語を使用している。しかし、それは少し古風であり、学生は自分の探査プログラムを開始するためのより良いと簡単な方法に値する、とPythonはこれらの機能を提供します。これは非常に単純で一貫性のある文法構造を有しており、標準ライブラリは、多数の、最も重要なのは、それがかなりコンピュータサイエンスの詳細にも、課題を解決するために、学生がプログラミング技術に集中することを可能にすることである。 Pythonを使って、生徒たちはすぐにこのようなループ(ループ)、手順(プロシージャ)としてセットアッププログラムの基礎を学ぶことができます。でも、最初のクラスでは、彼らはカスタムオブジェクトを使用しようとさせることができます。ラスでは、彼らはカスタムオブジェクトを使用しようとさせることができます。

プログラミングの経験は、コンピュータが(など、C、のような)静的な言語を使用し、当初決して不自然なようである。これは、コース全体が遅くなるように、学生はまず、コンピュータの複雑な内部構造を理解しなければならないことができます。学生は、問題やデザインインターフェイスを解決するため、考えて見ると、コンピュータのポイントを使用する方法を学ぶ必要があります。長期目標ながら、静的コンピュータの研究が必要と利益であるが、まず第一に、しきい値をプログラムされる必要がそれほど高く混同しない。であるが、まず第一に、しきい値をプログラムされる必要がそれほど高く混同しない。

Pythonはプログラミングを学ぶための好ましいコンピュータ言語として多くの利点があります。 Javaのような、それは教室での最大の学生がプロジェクトのいくつかを実装することができ、標準的なライブラリをたくさん持っているし、これらのプロジェクトではなく、単純な加算と減算、乗算、除算4演算よりも、いくつかの実用的なアプリケーションとすることができる。一方、これらの標準ライブラリを使用すると、学生がプログラムを学び、再利用することができます。他のサードパーティモジュールの種々はまた、pygameのような、非常に使いやすく、直接学生を可能にするために使用することができる。うな、非常に使いやすく、直接学生を可能にするために使用することができる。

Pythonは、学生がテストの側縁に直接プログラムを記述することを可能にする対話型のインタプリタです。それはあなたのサイドウィンドウにコードを記述することができ、別のウィンドウで、コードを実行してテストします。き、別のウィンドウで、コードを実行してテストします。

このライブラリの特徴

この世界はあまりにも多くの数独ゲームや学習プログラム、娯楽のためのいくつかの、数学の研究のためのいくつかを持っており、このプロジェクトは、論理の研究に焦点を当てています。また、ここではロジックではなく、コンピュータサイエンスの観点よりも、出発点として見ると、人々の視点に捧げられています。そこで、本プロジェクトでは、次の特徴があります。そこで、本プロジェクトでは、次の特徴があります。

  1. 人々が「論理」の基本精神を学びましょう。

  2. これは、一般的なプログラミングのコースであること」ではありません」。これは、一般的なプログラミングのコースであること」ではありません」。

  3. これは、厳密な数学的な研究であること」ではありません」。これは、厳密な数学的な研究であること」ではありません」。

  4. 数独法は「非」コンピュータサイエンスの視点が、人間の視点を探索に基づいています。数独法は「非」コンピュータサイエンスの視点が、人間の視点を探索に基づいています。

  5. ストップは、人々が独自の方法を発見するために取得し、自分の言葉でそれに名前を付ける。 (これは内部でこのPythonのパッケージではありませんが、内部のこのコースで配置する必要がありますが。)ースで配置する必要がありますが。)

  6. 人々は、学生が自分の道を探るときに実行するために、Pythonプログラミングを学習することができます。Pythonプログラミングを学習することができます。

  7. 数独を解決するために、オブジェクト指向プログラミング(OOP)を学習する。 OOPのアプローチは、人間の思考や行動の角度を一致させることができます。 OOPのアプローチは、人間の思考や行動の角度を一致させることができます。

レッスンプラン

我々は、これらのプログラムを探索するサマーキャンプの数独ロジックを手配することができ、我々は目標を学習者がすべての数独ソリューションを学習できるようにすることはありません。対象の異なる数独の難易度の6種類を事前に手配することができますが、彼らは自分のレベルのを見つけてみましょう数独当社の目標は、数独のスキルを解決するために、それらのロジックを教えるために、私たちはさまざまな学習を行うことができ、異なる材料を使用しており、それを解決するためのロジックの精神にそれらすべてを教えることはありません。

誰がこれらのコースをすべきですか?

コースのそれぞれが適してグレード3-4を持っていた。

最初のステップ:それ自身の独立した筆跡を作る

営業時間:

14時間、7日間、2時間/日

目標:
  1. 彼は、各学習者の適切なレベルの数独を見つけてみましょう

  2. コンピュータ基本を学ぶ

ステップ2:数独を解決する方法を見つけることを学びなさい

営業時間:

14時間、7日間、2時間/日

目標:
  1. 彼らはモデルの名前と、このモードを記述するために言葉を書き留めて、自分の言葉で、解決すべき見つけたとき。

  2. 彼らは他の人に耳を傾ける博覧会の独自の方法を見つけるようにします。

  3. 彼らは上のような1から100のように、Pythonの基本的なプログラムを書く、とすることを学ぶ前に、宿題を解くことから道...

ステップ3:自分自身のプラクティスを見つけることがPythonプログラムを書き始める

営業時間:

14時間、7日間、2時間/日

目標:
  1. コンセプトに基づいて、オブジェクト指向プログラミング(OOP)を学習する。

  2. 彼らが発見した方法をシミュレートするために、オブジェクト指向プログラミングを使用することを学ぶ。

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

私たちは、これらのコースでは、我々はクラス、属性およびメソッドを設計する方法を詳細に説明することが準備されていませんので、我々は両方のカテゴリでこのライブラリで説明し、クラス定義、オブジェクト指向プログラミングの最も困難な部分であると考え数独のロックを解除する方法を学ぶために考えている学習者となるよう、属性やメソッド、私たちはこれらのクラスのデータ構造アナログができ、プロパティとメソッドは、数独を解決するためのシミュレーション環境を提起した。

まず、我々は美しい谷に想像することができ、家の間の9×9の正方形がある次のように、それらが配置されている。

_images/p4.png

イギリス虚

9カ国は、谷が9×9の合計を収容しながら、それぞれの国で、彼らはこの美しい谷に定住することを決め、一緒、9人を持って、あります。彼らは、(X-ウェイライン)各行を決め、各列(Y-ウェイライン)、およびすべての3x3のブロックは、すべての国の人が含まれていますので、彼らはこのグループには、本当のイギリスで、永続的に安心して一緒に暮らすことができますし、彼らがこの目標にそれを達成するのを助けることができると思います?

その後、我々はこの世界を良くするために、これらの人々を助けるために始めることができます...

カテゴリとは何ですか?オブジェクトとは何ですか?

OOPでは、カテゴリ(クラス)が主人公のように定義されている。 、ヒトJとしてそれを探る通信したり、記録を目的とするためには、同じ動作、特性と分類されている同じものの外観を持つことになります。我々は、クラスのような動物、象、動物のカテゴリのサブカテゴリであると思いますが、1象と象は、オブジェクトの2つのタイプのいずれかに属し動物である。

象に、自然、このオブジェクトはゾウや動物のクラスに属するが、ターゲットのニーズを見ながら、また、動物のカテゴリへの直接の対象とする象であってもよい。だから我々は、あなたがこのカテゴリー内の単一の独立したオブジェクトに接続されているだけで、人間の範疇かのように、私たちの本当のオブジェクト指向プログラミングは、世界のエンティティオブジェクト(オブジェクト)の中で述べていることを言うことができます。

我々は、範囲や必要性に基づいて設定され、我々は別のカテゴリをデザインし、それらが同時に同じオブジェクトに属してみましょうことができます。このような我々は都市の生態を勉強したいときなどは、頂きます、私たちは、動物のカテゴリなど何人かの人々、ペットを含むオブジェクトのこのカテゴリを設計するかもしれない...しかし、我々は、電話帳プログラムを作りたい人物カテゴリを設計、一部の人々は、このクラスのオブジェクトになりますが、彼らは携帯電話を持っていない限り、ペット、ペットが含まれていません。

このプロジェクトでは、主なカテゴリがありますように設計。

  • Numberクラス:

    私たちは、それぞれの番号が人である数独ゲームがかかる場合があります。全世界数独は、それぞれの国が9人を持って、9カ国があります。だから、ナンバークラスは、国家のカテゴリとみなすことができる。すべての国は、識別コード(ID)を持ってここに1-9で、それぞれの国が、この谷に住んでいるその人の位置を記録します。

  • Pointクラス:

    Pointオブジェクトは、家です。それが空である場合には、入学を申請するためにどの国の人々させることができ、それはあなたが生きていかなければならない場合、それはどの国の人であり、生きるために持っている場合、それぞれの家にマークされるのですか?

  • GroupBaseクラス:

    GroupBaseはつまり、そのオブジェクトは実体ではないが、グループクラスですが、実体の組み合わせのグループ。ここGroupBase3グループ、住宅建設のブロック群とグループXおよびY軸方向が含まれています。各オブジェクトには、多くの人々が住んでいたか、それが含まれている家の指摘だけでなく、ここに住んでいない国々の人々のだろうか?

  • ボックスクラス:

    これは、ブロックグループのためGroupBaseサブカテゴリです。 :左から、次のようにマークされたコードのブロックである右、上から下へ、合計9ブロックオブジェクト内の数独の世界

    _images/p5.png
  • LINEXクラス:

    GroupBaseこのサブクラス、家のためのグループX軸。次のように左から右に数独の世界では9のオブジェクトの合計は、1〜9のラベルが付いています。

    _images/p6.png
  • 線を引いたクラス:

    GroupBaseこのサブクラス、家のためのグループのY軸。以下のように上から下に数独の世界では9のオブジェクトの合計は、1〜9ラベル付けされます。

    _images/p7.png
  • Matrixクラス:

    Matrixクラスは、数独、全世界を定義しています。それはそれぞれの国が9人を持って、9カ国の人々を含む、美しい渓谷、ですが、谷の家は、英国を形成するために、いつまでも平和のうちに生存するこれらの人々に提供するために、9路盤を構築しました。

プロパティ(プロパティ)とは?

プロパティ(プロパティ)、クラス、文字とレコードの状態のメンバーを定義するために使用し、内部の定義のクラス(クラス)である。次の属性のいくつかを含むことができ、人のカテゴリー場合:この男は、彼はいくつかの子供がいたどのくらいのお金を所有、最初の子は、男性または女性で、それぞれの子それぞれが古い?

以下はこのプロジェクトのいくつかの主要なカテゴリに定義されている主な属性です。

  • Numberクラス:

    • V:国コード、1-9

    • P:人々が住んでいるこの国のすべての家をリスト

    • filled:どのように多くの人々は家に移動しました

  • Pointクラス:

    • X:家のx座標

    • Y:家のy座標

    • V:この家は、それが空である場合、その値は0であり、どの国の人が住んでいました

    • B:ブロックは添付の家

  • GroupBaseクラス:

    • IDX:このコードグループ

    • P:このグループの家の会員名簿

    • いっぱい:多くの人々のために生きてきたこのグループの

    • possilbe:このグループには住んでいなかった国々は、これらの国々のコードリストの値もある

  • ボックスクラス:

    • すべての属性が含まれていGroupBase

    • effects: すべてのネイバーは、このブロックをブロック

    • effectsX:このブロックは、x軸の等方性の隣人

    • effectsY:このブロックは、Y軸等方性の隣人

  • LINEXクラス:

    • GroupBaseは同じで属性

  • 線を引いたクラス:

    • GroupBaseは同じで属性

  • Matrixクラス:

    • P:二次配列の家のリスト、Pから[0][0] P〜[8] [8]、この谷にすべての住宅に代わって。

    • LINEX:X軸方向の家グループのリスト

    • 線を引いた:y軸は、グループの家をリストします

    • B:ブロックハウスグループリスト

    • N:すべての国のリスト

    • いっぱい:谷での滞在を持っているどのように多くの人々の記録を

メソッド(方法)とは何ですか?

方法(メソッド)は、クラスとそのオブジェクトの特定の動作の一部です。例えば我々はラジオのカテゴリを定義した場合、それは、ボタンのプロパティの一部を含むことになる、と私たちはボタンを押したときに、我々は、このアクションを実行するためにいくつかのメソッドを定義する必要があります。これらのアクションは、というようにCDにラジオ番組、または録画された番組の受信を開始することであってもよく、...

以下は、プロジェクトのクラスパスで使用される主な方法です。

  • Numberクラス:

    • setit(P1):誰かが自分の家を見つけたとき、彼らはこの方法を開始します

  • Pointクラス:

    • can_see(P1):ハウス****は別の家(P1)を参照してくださいかどうかをテスト?

    • can_see_those(POSLIST):ハウス**** POSLISTは家がリストされたかどうかをテストし、すべての家のリストが返さを見ることができます。

    ノート

    「見る」とは何ですか?

    その同じ行、同じ列、または1ブロック内の他の家との家、という点では、の家を見ることが可能である。

  • GroupBaseクラス:

    • グループをテストするには生きるために家のラベルVの人々を行うことができます。(V)を許可しますか?

    • get_num_pos(V):この家グループでは、国がまだ占有されていない場合人々は、カントリーハウス生活オブジェクトをV作っなし応答を配置します。

    • count_num_possible(カウント):自社グループ内では、それは家が生活の数を数えると等しくなるように利用できるようにすべきであることを意味し、カウントが取得されたパラメータがある場合は、国番号と国の人々のリストは、家に住んで利用できるように。

    • get_all_pos(method): get all houses in this group, if method=”a”; if method=”u”, get all empty houses, if method=”s”, get all not empty houses.
  • ボックスクラス:

    • すべてGroupBaseクラスメソッド

    • get_group_number(NUM):numは国家仮想****の形成をブロックすることができます家の中で国コードをテストする?

    ノート

    「仮想国民****」とは?

    ナショナルは、仮想の家のブロックグループ内に存在する。家のブロックでは、まだ占有されておらず、国が同じ方向に家に住んでされる可能性があり、すべての場合には、(XまたはY軸のいずれか)、その後、我々は**仮想を形成するこれらの家を呼び出すことができます国立**。私は、このブロックでは、最終的にはに住んでいるでしょう、この国の人々は知らないが、我々は、仮想国民から知っている、家は人々がこの国に住んでいることはできませんのと同じ方向に、他の地域とのけれどもA。

  • LINEXクラス:

    • GroupBase同じ方法

  • 線を引いたクラス:

    • GroupBase同じ方法

  • Matrixクラス:

    • get_all_pos(method): method=”a”、すべての住宅を取得する場合は、リストオブジェクト、method=”u” 使用可能なすべてのリストを取得する場合は、method=”s”、すべての生きて人間を取得する場合家のリスト。

    • sort_unassigned_pos_by_possibles(possibles):可用性のすべてのリストを取得し、これらを利用できるようにすることができなければならないだけpossibles== 0は、使用可能なすべてを取得する場合は、滞在するいくつかの国をpossibles。多くの国々が居住されるときに戻って応答、小型、大規模排出される。

    • can_see(p0, method=”u”, num=0): このような=0ナショナル·テンキーなどのハウス(P0)家のリストを見ることができ得る、唯一の家に住んでいる民のための国別コードを可能にするために利用できるようにことを示しています!。

    • setit(X、Y、V):ある家の安全な座標(x、y)に住んでいる人々のためのV国コードをしてみましょう。

    • (X、Y、V)を減少させる:ハウス(x、y)は、他の利用可能性をチェックするときは、この家を見ることができ、すでにこの国では(V)の可能性を生きる人々を失うため、このように利用できます。

    • 許可(X、Y、V):テストこの国(V)の人々は座標(x、y)の家に住むことができるかどうか?

    • (ファイル)をお読みください。定義ファイル(ファイル)からこの谷、人や居住の場所に最初の国を読み込みます。

数独定義ファイル

あなたは、数独の初期条件を定義することができます。テキストファイルの行に、以下に示すように、フォームXで、Y、V、、このプロジェクトは、[インストールディレクトリ]/独/ data /ディレクトリに置き、数独の数と定義されている、家の座標と乗員を定義内側。

例の定義は、初期の外観や外溶液の外観
m3.data

数独の外観を開始

数独は、溶液の外観でした

_images/m3.png _images/origin.png _images/result.png

数独に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、可能性の最終チェックリストは、それは家がその国の人々が生きるためにバインドされていることを意味します。

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

これは、数独ライブラリーを解決するために、オブジェクト指向プログラミングの使用である

インデックスと参照