記事のディレクトリ:
- タイトル
- スクリプト
- スクリプトロジック
- スクリプト2
- スクリプトの2つのロジック
- シェル溶液シェア
トピック:
ユニークな9×9の数を決定することは有効です。のみ、次の規則によれば、既に充填された番号が有効であることができるかどうかを確認します。
数字は1-9回だけ各行に現れます。
数字は1-9回のみ各列に表示されます。
図1-9のみ太い実線で区切られた各3x3の子宮内に一度現れます。
図は、部分的に満たされた有効なだけAの数です。
このスペースの数独部分は、数字と、空のセル「」表現に充填されています。
例1:
输入:
[
[ "5"、 "3"、 "7"、、、、]、 "" "" "" "" "" ""
[ "6"、 "" " "" 1" 、 "9"、 "5"、 ""、 ""、 ""]、
["。 "" 9" 、 "8"、 ""、 ""、 」。 ""。 "" 6" 、 ""]、
[ "8"、 ""、 ""、 ""、 "6"、 ""、 ""、 ""、 "3"]、
[ "4"、 ""、 ""、 "8"、 ""、 "3"、 ""、 ""、 "1"]、
[ "7"、 "。 」、 ""、 ""、 "2"、 ""、 ""、 ""、 "6"]、
[ " "" 6" 、 ""、 ""、 ""、 ""、 "2"、 "8"、 ""]、
["。 ""。 "" 。 "" 4" 、 "1"、 "9"、 ""、 ""、 "5"]、
[ " "" "" "" "" 8" 、" 。。 "" "" 7" 、 "9"]
]
输出:真
示例2:""、 "7"、 "9"] ] 出力:真例2:""、 "7"、 "9"] ] 出力:真例2:
输入:
[
[ "8"、 "3"、 "7"、、、、]、 "" "" "" "" "" ""
[ "6"、 "" " "" 1" 、 "9"、 "5"、 ""、 ""、 ""]、
["。 "" 9" 、 "8"、 ""、 ""、 」。 ""。 "" 6" 、 ""]、
[ "8"、 ""、 ""、 ""、 "6"、 ""、 ""、 ""、 "3"]、
[ "4"、 ""、 ""、 "8"、 ""、 "3"、 ""、 ""、 "1"]、
[ "7"、 "。 " ""、 ""、 "2"、 ""、 ""、 ""、"6 "]、
["。 "" 6 " ""、 ""、 ""、 ""、" 2 "" 8」、 " "]、
["。"、 "" 、 " " "4"、 "1"、 "9"、"。 "" " "5"]、
["。 "" "" """、 "8" ,,,「7」、「9」]「」「」
]
出力:偽
解釈:外部から最初の行58に加えて、最初の番号、実施例1の他のデジタルこの空間と同じである。
しかし宮殿の左上隅には2 3x3の8が存在していたようなので、この番号にのみ有効です
。説明:"" 5 "]、 [" "" "" "" "" 8 "" "" "" 7 "" 9「] ...... ] 出力:偽解釈:外部からの最初の行58の最初の数に加えて、1つの他のデジタル空間の例と同様である。ただし、3×3 2子宮内8が存在する左上隅に起因する、唯一の番号が無効であるように。概要:"" 5 "]、 [" "" "" "" "" 8 "" "" "" 7 "" 9「] ...... ] 出力:偽解釈:外部からの最初の行58の最初の数に加えて、1つの他のデジタル空間の例と同様である。ただし、3×3 2子宮内8が存在する左上隅に起因する、唯一の番号が無効であるように。概要:
唯一の有効な番号(一部が満たされている)は、必ずしも解決可能ではありません。
上記の規則に従ってのみ有効であることができる数値が満たされたかどうかを確認する必要があります。
ユニークなシーケンス備えるの数だけ数字1-9と考えると「」。
数独は常に9x9の形式で与えられます。
スクリプト:[使用:152ms]
クラスソリューション: DEF isValidSudoku(自己、ボード:リスト[リスト[STR]]) - > BOOL : N1、N2、N3、N4 = 0、0、0、0 NUM1、NUM2 = 0、0 STR2、STR3、STR4 = "" 、"" 、"" DEF test_str(STRR): N1 = strr.count(" " ) N2 = LEN(セット(STRR)) であれば(9! - N1)=(N2 - 1): リターン(" 偽の" ) 他: (リターン" 真の" ) #各行を確認 するために私にレンジ(9。 ): N1 =ボード[I] .count(' ' ) N2 = LEN(SET(ボード[I]) ) のIF(9。 - N1)=(N2 - !1。 ): リターン(偽) #は、各列をチェックするために私にレンジ(9 ): STR1。= "" のための J での範囲(9 ): 0009 + = ボード[J] [i]の 結果 = test_str(STR1) であれば、結果== " 偽" : リターン(偽) 他: パス #检查小正方形 のための私で範囲(9 ) のための J における範囲(9 ): もし J < 3 + = STR2のボード[I] [J] のelif 2 <J < 6 : STR3 + = ボード[I] [J] 他: STR4 + = ボード[I] [J] もし(I + 1)%3 == 0 : 結果1 = test_str(STR2) 結果2 = test_str(STR3) result3 = test_str(STR4) であれば結果1 == " 偽"又は結果2 == "偽"またはresult3 == " 偽」: リターン(偽) 他: STR2 = "" STR3 = "" STR4 = "" リターン(真)
スクリプトロジック:
- まず:数独の要件に沿った小さな正方形の数字と順位を決定するために、どのように、私は考えるです:行、列、小さな正方形て文字列に、文字列要素は、数n1を必要と、セットに、文字列、その後、コレクション内の要素の数を求め、その後、値を比較することにより、n1とn2はドット数の数独要件[注]処理かどうかを知ります
- コンテンツのリストを横断することにより、直接行が与えられて決定することができます
- リストは、トラバースへのループのための2つを使用することが必要と判断しました
- 著者はロジックを使用し、より気に小さな正方形を分析することである:三列、すなわち、与えられたリストの最初の3得ることにより3の倍数ならば、異なるポイントに行の各列のディジタル要素可変STR3に789等の可変STR1に123などの変数、;にするかどうかをいくつかの別を満たしながら、最終的な判定STR1、STR2、STR3に必要な変数STR2によって456カラム
- 彼らは準拠していない場合は、偽の終了を返すことができます。
スクリプトII:[使用:100ミリ秒] [予約]
クラスソリューション: DEF isValidSudoku(自己、ボード): "" " :型板:リスト[リスト[STR] :RTYPE:BOOL """ #INIT データ 行 [{} = 用 I における範囲(9 )] カラム = [{} のために、私は中範囲(9 )] ボックス = [{} のための I における範囲(9 )] #検証ボード 用 I における範囲(9 ) のために J中範囲(9 ): NUM = ボード[I] [J] もし!NUM = " 。' : NUM = INT (NUM) box_index =(I // 3)* 3 + J // 3つの #は、現在のセルの値に保つ 行を[I] [NUM] =行[I]に.get(NUM、0)+ 1 列[J] [NUM] =列[J]に.get(NUM、0)+ 1つの ボックス[box_index] [NUM]=ボックス[box_index]に.get(NUM、0)+ 1つの #チェック場合、この値は既に前に見られた 場合、行[I] [NUM]> 1または列[J] [NUM]> 1またはボックス[box_index] [ NUM]> 1 : リターン偽 trueを返します
スクリプトの2つのロジック:
- このスクリプトは、それが解決するために、単独内の要素の数との間の視覚的な相関関係のいくつかの種類を使用することで、ロジックを理解していませんでした。興味のある友人は、深さで見ることができます
シェルソリューションシェア:
- 前にも使用し、この問題に対処するためのシェル上でシェルを学習するときに、著者のCSDNのブログで、次はこの問題のリンクを処理するためにシェルを使用することです:
- https://blog.csdn.net/weixin_43428906/article/details/102895947