9*9数独

質問が意図され
、各文字は、グリッドは満たしていないことを示し、数字または「」で、ボックス81内のデータを表す、81個の文字を含む文字列を入力するには
、各ソリューションのための唯一の固有の番号があると仮定するとプログラムの最後には、最後には、ファイルを表します

#の説明では
、添え字文字列行列である(I / 9、I%9における添字にそれをマップするために0から始まる
インデックス列添字I * 9 + jにマップされたマトリックス
3×3 = 9×3×3サイズの正方形の合計は、インデックスは丸め下で、0からX / 3を開始し、Y / 3丸めグリッドが上方に配置された計算することができます。

各行の各列は、各3×3のグリッドがバイナリデジタル数1-9充填することができるで表される
演算&によって充填することができるデジタルこの位置の交点であります

Pアレイと前処理NUMアレイ、
P-アレイ上の対応する数は9ビットのバイナリ数に各ビットを表し、
1〜2アレイはNUM表し9 1Sの数-1にそれぞれ数を
:プルーニング最適化
1 )、現在の法的デジタル缶フィルの先頭からの位置の最小数を埋めるために検索順序を最適化する効果的にあなたが直接、プロセスの意志をバックトラックの数を埋めることができる唯一のこと、例えば、時間の複雑さを向上させ、探索木の大きさを低減することができます少ない
)2状態の数の任意の同等の冗長性を排除するためには、単に他の場所は、検索より深い層に検索することができるように、可能な位置を埋めるために探している
3)lowbitを求める第1の使用します

1の#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  CONST  INT N = 9 4  INT R [N]、C [N]。
5  INT NUM [ 1 << N]、P [ 1 << N]。
6  INT G [ 3 ] [ 3 ]。
7  チャー STR [ 81 ]。
8インラインINT lowbit(INT X){
 9     リターン X& - X。
10  }
 11インラインINT 取得int型のx、int型Y){
 12     リターン R [X]&C [Y]&G [X / 3 ] [Y / 3 ]。
13  }
 14インラインボイドのinit(){
 15     のためのINTは私= 0 ; I <N; I ++ 16        R [I] = C [I] =(1 << N) - 1 17     のためにINT iは= 0 ; iは< 3 ; I ++ 18        のためのINT J = 0 ; J < 3; J ++ 19           G [I] [J] =(1 << N) - 1 20  }
 21  ブール DFS(INT CNT){
 22     であれば(!CNT)リターン 1 23  
24     INT MIN_ = 10 25     のint X、Y。
26  
27     のためにINTは iが= 0を I ++; I <N 28        のためのint型 J = 0 ; J <N; J ++ 29           であれば(STR [I * 9 + j] ==" ' ){
 30              INT T = NUM [ GET (I、J)]。
31              であれば(T < 分_){
 32                 MIN_ = T。
33                 X = I。
34                 、Y = J。
35              }
 36           }
 37  
38     のためにINT I = GET(X、Y); I; I- = lowbit(I)){
 39        INT T = P [lowbit(I)]。
40        R [X] - = 1 << T。
41        C [Y] - =1 << T。
42        G [X / 3 ] [Y / 3 ] - = 1 << T。
43        STR [X * 9 + Y] = T + ' 1 ' 44        であれば(DFS(CNT- 1))リターン 1 45        R [X] + = 1 << T。
46        C [Y] + = 1 << T。
47        G [X / 3 ] [Y / 3 ] + = 1 << T。
48        STR [X * 9 + Y] = '" ;
49     }
 50     リターン はfalse ;
51  }
 52インラインボイド時間(){
 53     のためにINTは iは= 0 ; I <N; I ++ 54        P [ 1 << I] = iは、
55     のためにINT iが= 0 ; I < 1 << Nであり; I ++ ){
 56        int型 CNT = 0 57        のためのint型 ; J; J = J-= lowbit(J))
 58           CNT ++;
59        NUM [I] = CNT。
60     }
 61  }
 62  、INT (){主
 63     時間()。
64     一方(CIN >> STR、STR [ 0 ] =!' E ' ){
 65        のinit();
66        INT CNT = 0 67        のためのint型私は= 0、K = 0 ; I <N; I ++ 68           のためのint型 J = 0 ; jの<N; J ++で、k ++ 69              もし!(STR [K] = "' ){
 70                 INT T = STR [K] - ' 1 ' ;
71                 R [I] - = 1 << T。
72                 C [J] - = 1 << T。
73                 G [I / 3 ] [J / 3 ] - = 1 << T。
74              }
 75              他の CNT ++ ;
76の       DFS(CNT)。
77        COUT << STR << ENDL。
78     }
 79     リターン 0 80 }

 

おすすめ

転載: www.cnblogs.com/hhyx/p/12401918.html