題目描述: 判斷一個(gè) 9x9 的數(shù)獨(dú)是否有效。只需要根據(jù)以下規(guī)則,驗(yàn)證已經(jīng)填入的數(shù)字是否有效即可。 數(shù)字 1-9 在每一行只能出現(xiàn)一次。 上圖是一個(gè)部分填充的有效的數(shù)獨(dú)。 數(shù)獨(dú)部分空格內(nèi)已填入了數(shù)字,空白格用 '.' 表示。 示例 1: 輸入: 示例 2: 輸入: 說(shuō)明: 一個(gè)有效的數(shù)獨(dú)(部分已被填充)不一定是可解的。 ? 思想: 由于board中的整數(shù)限定在1到9的范圍內(nèi),因此可以分別建立哈希表來(lái)存儲(chǔ)任一個(gè)數(shù)在相應(yīng)維度上是否出現(xiàn)過(guò)。維度有3個(gè):所在的行,所在的列,所在的box,注意box的下標(biāo)也是從左往右、從上往下的。 遍歷到每個(gè)數(shù)的時(shí)候,例如boar[i][j],我們判斷其是否滿(mǎn)足三個(gè)條件: 在第 i 個(gè)行中是否出現(xiàn)過(guò)
代碼: class Solution { public: bool isValidSudoku(vector<vector<char>>& board) { int row[9][10] = {0};// 哈希表存儲(chǔ)每一行的每個(gè)數(shù)是否出現(xiàn)過(guò),默認(rèn)初始情況下,每一行每一個(gè)數(shù)都沒(méi)有出現(xiàn)過(guò) // 整個(gè)board有9行,第二維的維數(shù)10是為了讓下標(biāo)有9,和數(shù)獨(dú)中的數(shù)字9對(duì)應(yīng)。 int col[9][10] = {0};// 存儲(chǔ)每一列的每個(gè)數(shù)是否出現(xiàn)過(guò),默認(rèn)初始情況下,每一列的每一個(gè)數(shù)都沒(méi)有出現(xiàn)過(guò) int box[9][10] = {0};// 存儲(chǔ)每一個(gè)box的每個(gè)數(shù)是否出現(xiàn)過(guò),默認(rèn)初始情況下,在每個(gè)box中,每個(gè)數(shù)都沒(méi)有出現(xiàn)過(guò)。整個(gè)board有9個(gè)box。 for(int i=0; i<9; i ){ for(int j = 0; j<9; j ){ // 遍歷到第i行第j列的那個(gè)數(shù),我們要判斷這個(gè)數(shù)在其所在的行有沒(méi)有出現(xiàn)過(guò), // 同時(shí)判斷這個(gè)數(shù)在其所在的列有沒(méi)有出現(xiàn)過(guò) // 同時(shí)判斷這個(gè)數(shù)在其所在的box中有沒(méi)有出現(xiàn)過(guò) if(board[i][j] == '.') continue; int curNumber = board[i][j]-'0'; if(row[i][curNumber]) return false; if(col[j][curNumber]) return false; if(box[j/3 (i/3)*3][curNumber]) return false; row[i][curNumber] = 1;// 之前都沒(méi)出現(xiàn)過(guò),現(xiàn)在出現(xiàn)了,就給它置為1,下次再遇見(jiàn)就能夠直接返回false了。 col[j][curNumber] = 1; box[j/3 (i/3)*3][curNumber] = 1; } } return true; } }; ? 來(lái)源:https://www./content-4-656901.html |
|
來(lái)自: 印度阿三17 > 《開(kāi)發(fā)》