プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

数独解決アルゴリズム


このセクションでは、数独と呼ばれる有名な数独の問題を解決しようとします。数独は9x9の数字グリッドであり、グリッド全体も3x3のボックスに分割されています。数独を解決するためのルールがいくつかあります。

この問題を解決するには、1から9までの数字を使用する必要があります。

1行、1列、または1つの3x3ボックスで1桁を繰り返すことはできません。

バックトラッキングアルゴリズムを使用して、数独の問題を解決しようとします。一部のセルが数字で埋められると、それが有効かどうかをチェックします。無効な場合は、他の番号をチェックします。すべての数字が1から9までチェックされ、有効な数字が見つからない場合は、前のオプションに戻ります。

入力と出力

入力:これは、数独グリッドとして9x9の行列を取ります。一部の値はグリッドに配置されます。空白スペースは0で示されます。 数独解決アルゴリズム 出力:数値で満たされた最終的なマトリックス(数独グリッド)。解が存在しない場合は、falseを返します。31 6 | 5 7 8 | 4 9 25 2 9 | 1 3 4 | 7 6 84 8 7 | 6 2 9 | 5 3 1 ------------------------ 2 6 3 | 4 1 5 | 9 8 79 7 4 | 8 6 3 | 1 2 58 5 1 | 7 9 2 | 6 4 3 ------------------------ 1 3 8 | 9 4 7 | 2 5 66 9 2 | 3 5 1 | 8 7 47 4 5 | 2 8 6 | 3 1 9 

アルゴリズム

isPresentInCol(col、num)

入力: 列と目標数。

出力- 指定された列に番号が存在する場合はTrue。

グリッド内の各行rから開始し、grid [r、col] =numの場合は実行し、trueを返します。それ以外の場合はfalseを返します。End

isPresentInRow(row、num)

入力- 行とターゲット番号。

出力- 指定された列に番号が存在する場合はTrue。

グリッド内の各列cから開始し、grid [row、c] =numの場合は実行し、trueを返します。それ以外の場合はfalseを返します。End

isPresentInBox(boxStartRow、boxStartCol、num)

入力- 3 x 3ボックスの開始行と列、およびターゲット番号。

出力- ボックスに番号が表示されている場合はTrue。

 boxStartRowの各行rを次の3行に開始し、boxStartColの各列を次の3列に実行し、grid [r、c] =numの場合は実行し、trueを返します。 

findEmptyPlace(row、col)

入力: グリッドの行と列。

出力- grid [row、col]が空の場合はtrueを返し、そうでない場合はfalseを返します。

グリッド内の各行rから開始し、グリッド内の各列cに対して実行し、grid [r、c] =0の場合に実行し、trueを返します。donedone return falseEnd 

isValidPlace(row、col、num)

入力: 行、グリッドの列、および確認する番号。

出力: 確かに、数値を位置grid [row、col]に配置する場合は有効です。

 isPresentInRow(row、num)とisPresentInCol(col、num)およびisPresntInBox(row – row mod 3、col – col mod 3、num)がすべてfalseの場合に開始し、trueEndを返します

solveSudoku(数独グリッド)

入力: 数独の未解決のグリッド。

出力: 解決後のグリッド。

グリッド内に空の場所がない場合に開始し、1から9までの数値に対してtrueを返し、isValidPlace(row、col、number)の場合は実行し、grid [row、col]:=solveSudoku=trueの場合は数値を返します。 true grid [row、col]:=0完了returnfalseEnd 

 #include  #define N 9using namespace std; int grid [N] [N] ={{3、0、6、5、0、8、4、0、0}、{5、2、 0、0、0、0、0、0、0}、{0、8、7、0、0、0、0、3、1}、{0、0、3、0、1、0、0、 8、0}、{9、0、0、8、6、3、0、0、5}、{0、5、0、0、9、0、6、0、0}、{1、3 0、0、0、0、2、5、0}、{0、0、0、0、0、0、0、7、4}、{0、0、5、2、0、6、3 0、0}}; bool isPresentInCol(int col、int num){// numがcolに存在するかどうかをチェックfor(int row =0; row  

出力

 3 1 6 | 5 7 8 | 4 9 25 2 9 | 1 3 4 | 7 6 84 8 7 | 6 2 9 | 5 3 1 ------------------------ 2 6 3 | 4 1 5 | 9 8 79 7 4 | 8 6 3 | 1 2 58 5 1 | 7 9 2 | 6 4 3 ------------------------ 1 3 8 | 9 4 7 | 2 5 66 9 2 | 3 5 1 | 8 7 47 4 5 | 2 8 6 | 3 1 9 

  1. C++で部分的に満たされた数独グリッドを解決するためのプログラム

    部分的に塗りつぶされた数独グリッドがあり、これを解決する必要があるとします。数独は9×9の数字グリッドであり、グリッド全体も3×3のボックスに分割されていることがわかっています。数独を解決するためのルールがいくつかあります。 この問題を解決するには、1から9までの数字を使用する必要があります。 1行、1列、または1つの3×3ボックスで1桁を繰り返すことはできません。 バックトラッキングアルゴリズムを使用して、数独問題の解決を試みます。一部のセルが数字で埋められると、それが有効かどうかをチェックします。無効な場合は、他の番号をチェックします。すべての数字が1〜9でチェックされ、

  2. 数独グリッドを検証するプログラムは、Pythonで解決可能かどうか

    9×9の数独グリッドが1つあるとします。それが有効か今かを確認する必要があります。次のルールに従って、塗りつぶされたセルのみを検証する必要があります- 各行には、繰り返しなしで1〜9の数字が含まれている必要があります。 各列には、繰り返しなしで1〜9の数字が含まれている必要があります。 グリッドの9(3-3)サブボックスのそれぞれには、繰り返しなしで1-9の数字が含まれている必要があります。 数独グリッドが-のようなものだとします これは有効です。 これを解決するには、次の手順に従います- 0から8の範囲のiの場合 row、col、block、ro