1. 程式人生 > >有效的數獨 LeetCode(陣列的巧妙運用)

有效的數獨 LeetCode(陣列的巧妙運用)

  有效的數獨

判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。

  1. 數字 1-9 在每一行只能出現一次。
  2. 數字 1-9 在每一列只能出現一次。
  3. 數字 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"]
]
輸出:
true

示例 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"]
]
輸出:
false 解釋: 除了第一行的第一個數字從 5 改為 8 以外,空格內其他數字均與 示例1 相同。 但由於位於左上角的 3x3 宮內有兩個 8 存在, 因此這個數獨是無效的。

說明:

  • 一個有效的數獨(部分已被填充)不一定是可解的。
  • 只需要根據以上規則,驗證已經填入的數字是否有效即可。
  • 給定數獨序列只包含數字 1-9 和字元 '.' 。
  • 給定數獨永遠是 9x9 形式的。

題解:

今天刷了好幾道題,就這題還有點意思,主要是優化,橫縱座標的有效性沒問題直接用map搞,3x3的方格的有效性我一開始是直接寫了個check函式,在函式裡用map進行驗證,後來看見別人的程式碼,覺得很巧妙,可以開一個三維陣列,假設驗證第i行第j個,那麼可以把它唯一標記為p[i/3][j/3],可以驗證(0,0),(0,1)一直到(2,2)也就是第一個方格所有座標都符合這個唯一標記,而其他的座標不符合,那麼開一個三維陣列就可以標記整張圖的每個3x3的方格里的有效性。我修改之後的時間居然跑得和原來的一樣。。莫名其妙

我修改前的程式碼:

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        for(int i=0;i<9;i++)
        {
            map<char,int>p;
            map<char,int>p1;
            for(int j=0;j<9;j++)
            {
                if(i%3==0&&j%3==0)
                {
                    if(!check(board,i,j))
                        return false;
                }
                if(board[i][j]!='.')
                {
                    if(p[board[i][j]])
                        return false;
                    p[board[i][j]]=1;
                }
                if(board[j][i]!='.')
                {
                    if(p1[board[j][i]])
                        return false;
                    p1[board[j][i]]=1;
                }
            }
        }
        return true;
    }
    bool check(vector<vector<char>>& board,int sx,int sy)
    {
        map<char,int>p;
        for(int i=sx;i<sx+3;i++)
        {
            for(int j=sy;j<sy+3;j++)
            {
                if(board[i][j]=='.')
                    continue;
                if(p[board[i][j]])
                    return false;
                p[board[i][j]]=1;
            }
        }
        return true;
    }
};

我修改後的程式碼:

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        int p2[10][10][10];
        memset(p2,0,sizeof(p2));
        for(int i=0;i<9;i++)
        {
            map<char,int>p;
            map<char,int>p1;
            for(int j=0;j<9;j++)
            {
                if(board[i][j]!='.')
                {
                    if(p[board[i][j]])
                        return false;
                    p[board[i][j]]=1;
                    int t=board[i][j]-'0';
                    if(p2[i/3][j/3][t])
                        return false;
                    p2[i/3][j/3][t]=1;
                }
                if(board[j][i]!='.')
                {
                    if(p1[board[j][i]])
                        return false;
                    p1[board[j][i]]=1;
                }
            }
        }
        return true;
    }
};

相關推薦

有效 LeetCode(陣列巧妙運用)

  有效的數獨 判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。 上圖是一個部分填充

swift 有效 - LeetCode

判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的&nbs

Leetcode演算法——36、判斷有效

判斷一個 9*9 的數獨面板是否是有效的。 如果已經被填充的數字滿足以下條件,則說明是有效的: 每一行只能包含無重複數字1-9 每一列只能包含無重複數字1-9 每一個 3*3 的子面板只能包含無重複數字1-9 備註: 一個有效的數獨面板(

Codewars 打怪日記 5星級kyu 遊戲 我是否完成了陣列 Did I Finish my Sudoku? 看小菜和大神迴圈的巧妙運用

史蒂夫·喬布斯說過,每個人都應該學習給電腦編寫程式的技術,因為這一過程能夠教你如何去思考!學習程式設計的渠道有很多種,比如你可以利用一些互動平臺或者書籍去學習程式設計,無論是哪種,只要找到適合自己的就OK。程式設計極富有創造性,你可以創造出許多新奇有趣的想法。很多時候,開發

LeetCode 解題筆記——有效

題目描述:判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔

leetcode-36-有效

bool isValidSudoku(vector<vector<char>>& board) { int row[9][9] = {0}, col[9][9] = {0}, box[9][9] = {0}; for (int i =

二維陣列 有效 go語言

判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。 上圖是一個部分填充的有效的數獨。 數獨部分空格內已填入了數字,

Leetcode題庫——36.有效

@author: ZZQ @software: PyCharm @file: leetcode36_isValidSudoku.py @time: 2018/11/19 19:27 要求:判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現

Leetcode 有效(c++) 清晰易懂

判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。 上圖是一個部分填充的有效的數獨。 數獨部分空格內

Leetcode演算法Java全解答--36. 有效

Leetcode演算法Java全解答–36. 有效的數獨 文章目錄 Leetcode演算法Java全解答--36. 有效的數獨 題目 想法 結果 總結 程式碼 我的答案 大佬們的答案

Leetcode 的強大之處  演算法題解 in Swift ( 有效 , 36 ) 及其 Code Review

Leetcode 的強大之處,挺多的。 本文寫的是,其強大的討論區。 討論區裡面,有各種具有啟發性的程式碼。 (換句話說,就是有很強的程式碼。看了,覺得腦洞大開,大神們把語言的語法特性發揮到了極致) 裡面有各種常見語言的實現 ( 這裡指 Leetcode 主站的, 中文站點的同一功能弱了一點 )

leetcode-有效

判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。 上圖是一個部分填充的有效的數獨。 數獨部分空格內已

36.有效-Python-LeetCode

一、題目 二、解法 結語 一、題目 判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現

Leetcode演算法題(C語言)11--有效

題目:有效的數獨 判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 1 數字 1-9 在每一行只能出現一次。 2 數字 1-9 在每一列只能出現一次。 3 數

leetcode有效(Python解答)

題目: 判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個

LeetCode題目--有效(python/Java實現)

題目 判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以

LeetCode】36. 有效

題目描述 判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗

leetcode題庫——有效

題目描述: 判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。 上圖是一個部分填充的有

LeetCode 36. 有效 Valid Sudoku(C語言)

題目描述: 判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。 上圖是一個部分填

LeetCode-36. 有效

題目地址:https://leetcode-cn.com/problems/valid-sudoku/ 思路:暴力 AC程式碼: class Solution { public: bool isValidSudoku(vector<vector<char>&