有效的數(shù)獨 (LeetCode)

請你判斷一個?
9 x 9
?的數(shù)獨是否有效。只需要?根據(jù)以下規(guī)則?,驗證已經(jīng)填入的數(shù)字是否有效即可。
數(shù)字?
1-9
?在每一行只能出現(xiàn)一次。數(shù)字?
1-9
?在每一列只能出現(xiàn)一次。數(shù)字?
1-9
?在每一個以粗實線分隔的?3x3
?宮內(nèi)只能出現(xiàn)一次。(請參考示例圖)
注意:
一個有效的數(shù)獨(部分已被填充)不一定是可解的。
只需要根據(jù)以上規(guī)則,驗證已經(jīng)填入的數(shù)字是否有效即可。
空白格用?
'.'
?表示。
解題代碼
????思路來源為題解區(qū)大佬,?最開始只能想到暴力法。然后一直在找取巧的思路,但是無果,只好去題解區(qū)逛逛,然后就發(fā)現(xiàn)了這個

經(jīng)過大半天的借鑒,終于看懂了思路。
思路如下:
????首先聲明三個數(shù)組,長度為9,分別為:行,列,塊。即九行、九列、九個九宮格。之所以這么聲明巧的就是接下來的。
????題目要求,每行、每列、每個九宮格 都不能有重復數(shù)字。所以需要檢測每行每列每個九宮格。
????然后,int 類型 C# 中 有四個字節(jié),即 32 位,也就是 32 個 可為 01 。所以,可根據(jù)位運算,用其中九個位,看自己癖好,此處使用1~10(零位跳過)。
? ? 再回到邏輯中。接下來就是一個循環(huán)遍歷數(shù)獨中每個元素。
????進入for循環(huán)內(nèi)。先取橫縱坐標,記為 x,y。然后判斷是否為 “.”,即判斷是否未存入數(shù)字。然后就是轉(zhuǎn) char 為 數(shù)字,因為是 1~9 所以 byte 夠用(算法主打就是能省就?。?/p>
????接下來就是三個判斷,這也是關(guān)鍵。
????整體上來說就是判斷三個數(shù)組中是否已存入某一個數(shù)字,未存入就存入,已存入就返回false。
????以九宮格驗證為例:
????第一行 獲取此時九宮格的序號。
????第三行(二行為空行)
????此時 num 為 當前數(shù)獨內(nèi)數(shù)字,block[tt] 為此時九宮格的存儲狀態(tài),block [tt] >> num 為此數(shù)字向右移num位。
????舉例:如果此九宮格內(nèi)存存入過 1,5,7。 則此時 int 類型為 1010_0010 前的零省略.
此例右移 num 位,如果num為5,則此時 int 類型為0000_0101.
????然后對 1?進行 & (AND 運算)。AND運算同為1則為1,否則為0。此時舉例 int 類型變?yōu)?000_0001。然后跟 1 對比,相等,即 num?已經(jīng)存過。返回false。
????第四行 同理 先讓1 左移 num 位,然后做 | 運算(OR?為兩個數(shù)的同一位,有一個 1 就為 1 )。再存入此位置。
最后等循環(huán)結(jié)束,如果都沒事就返回 true。
