タイトル説明
36.効果的な数独
ユニークな9×9の数を決定することは有効です。のみ、次の規則によれば、既に充填された番号が有効であることができるかどうかを確認します。
数字1~9は、各行に一度だけ現れます。
番号1-9は、各列に一度だけ表示されます。
図1-9のみ太い実線で区切られた各3x3の子宮内に一度現れます。図は、部分的にしか満たされた有効な数です。
このスペースの数独部分は、数字と、空のセル「」表現に充填されています。
例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:入力:
[ [ "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"] ]9" ] ]9" ] ]出力:偽
解釈:5~8外部から最初の番号の最初の行に加えて、実施例1の他のデジタルこの空間と同じです。
しかし、宮殿の左上隅に2 3x3の8が存在しているので、これだけ数が有効ではありません。
説明:唯一の有効な番号(一部が満たされている)は、必ずしも解決可能ではありません。
上記の規則に従ってのみ有効であることができる数値が満たされたかどうかを確認する必要があります。
与えられた固有のシーケンスの数は、数字だけ1-9とを備えて「」。
数独は常に9x9の形式で与えられます。出典:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/valid-sudoku
すべてのネットワークからの控除が著作権を保有。商業転載は許可公式、非商用の転載は、ソースを明記してくださいお問い合わせください。
回答:
回答:
個人の考え:
図1に示すように、重複する番号の各ライン検出。
図2に示すように、重複する番号の各列検出。
3、3 * 3の検出のそれぞれに重複番号について。
96ms
/ * * * @param {文字[] []}ボード * @return {ブール} * / 関数isRepeat(ARR){ せハッシュ = {} ため(LET I = 0; I <arr.length; iは++ ){ もし(!ますisNaN(ARR [I])){ 場合(ハッシュ[[i]のARR]){ 返す 偽 } 他{ ハッシュ[[i]はARR] = 1 } } } を返す 真 } VAR isValidSudoku = 機能(ボード){ 結果を聞かせて colArrを聞かせて = [] せblockArr = [] // 重複検出するかどうかを各列 のための(LET I = 0;私はboard.lengthを<; I ++は){ 結果 = isRepeat(ボード[I]) IF(!結果){ コンソール。 (ログ 'OK繰り返し' ) リターン 偽へ } } // 各列の検出を複製するかどうかを するための式(I ++; Iはboard.lengthを<I = 0 LET {) のための(LET J = 0; J <ボード[I] .LENGTH。 ++ J ){ IF(!colArr [J]){ colArr [J]= [] } colArr [J] .push(ボード[I] [J]) } } のための(I = 0を聞かせて、私はcolArr.lengthを<; Iは++ ){ 結果 = isRepeat(colArr [I]) であれば(!結果){ console.log( '列重复' ) を返す 偽 } } // 3 * 3是否重复 ブロック= 0せための(I = 0せ; iがboard.lengthを<; Iは++ ){ リセットせ = ブロックの ため J = 0せを( ; J <ボード[I] .LENGTH; J ++ ){ もし (!blockArr [ブロック]){ blockArr [ブロック] = [] } blockArr [ブロック] .push(ボード[I] [J]) であれば((J + 1)%3 === 0 ){ ブロック ++ } 場合( j個の=== 8 ){ ブロック = リセット } } もし、((I + 1)%3 === 0 ){ ブロック + = 3 } } のための(I = 0せ; iがblockArr.lengthを<; Iは++ ){ 結果 = isRepeat(blockArr [i])と あれば(! {結果) はconsole.log( '* 3つの反復配列を3' ) の戻り をfalseにする } } // を通じて検出これら3 リターン trueにします };