37. Sudoku Solver

題目鏈接
tag:

  • Hard曹货;

question:
??Write a program to solve a Sudoku puzzle by filling the empty cells.

A sudoku solution must satisfy all of the following rules:

  1. Each of the digits 1-9 must occur exactly once in each row.
  2. Each of the digits 1-9 must occur exactly once in each column.
  3. Each of the the digits 1-9 must occur exactly once in each of the 9 3x3 sub-boxes of the grid.

Empty cells are indicated by the character '.'.


A sudoku puzzle...
...and its solution numbers marked in red.

Note:

  • The given board contain only digits 1-9 and the character '.'.
  • You may assume that the given Sudoku puzzle will have a single unique solution.
  • The given board size is always 9x9.

思路:
??這道求解數(shù)獨(dú)的題是在之前那道 Valid Sudoku 驗(yàn)證數(shù)獨(dú)的基礎(chǔ)上的延伸,之前那道題讓我們驗(yàn)證給定的數(shù)組是否為數(shù)獨(dú)數(shù)組,這道讓我們求解數(shù)獨(dú)數(shù)組灭将,跟此題類似的有Permutations 全排列Combinations 組合項(xiàng)占遥, N-Queens N皇后問題等等,其中尤其是跟 N-Queens N皇后問題的解題思路及其相似痘煤,對于每個(gè)需要填數(shù)字的格子帶入1到9,每代入一個(gè)數(shù)字都判定其是否合法猿规,如果合法就繼續(xù)下一次遞歸衷快,結(jié)束時(shí)把數(shù)字設(shè)回'.',判斷新加入的數(shù)字是否合法時(shí)姨俩,只需要判定當(dāng)前數(shù)字是否合法蘸拔,不需要判定這個(gè)數(shù)組是否為數(shù)獨(dú)數(shù)組,因?yàn)橹凹舆M(jìn)的數(shù)字都是合法的环葵,這樣可以使程序更加高效一些调窍,具體實(shí)現(xiàn)如代碼所示:

class Solution {
public:
    void solveSudoku(vector<vector<char> > &board) {
        if (board.empty() || board.size() != 9 || board[0].size() != 9) return;
        solveSudokuDFS(board, 0, 0);
    }
    bool solveSudokuDFS(vector<vector<char> > &board, int i, int j) {
        if (i == 9) return true;
        if (j >= 9) return solveSudokuDFS(board, i + 1, 0);
        if (board[i][j] == '.') {
            for (int k = 1; k <= 9; ++k) {
                board[i][j] = (char)(k + '0');
                if (isValid(board, i , j)) {
                    if (solveSudokuDFS(board, i, j + 1)) return true;
                }
                board[i][j] = '.';
            }
        } else {
            return solveSudokuDFS(board, i, j + 1);
        }
        return false;
    }
    bool isValid(vector<vector<char> > &board, int i, int j) {
        for (int col = 0; col < 9; ++col) {
            if (col != j && board[i][j] == board[i][col]) return false;
        }
        for (int row = 0; row < 9; ++row) {
            if (row != i && board[i][j] == board[row][j]) return false;
        }
        for (int row = i / 3 * 3; row < i / 3 * 3 + 3; ++row) {
            for (int col = j / 3 * 3; col < j / 3 * 3 + 3; ++col) {
                if ((row != i || col != j) && board[i][j] == board[row][col]) return false;
            }
        }
        return true;
    }
};

參考:http://www.cnblogs.com/grandyang/p/4421852.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市张遭,隨后出現(xiàn)的幾起案子邓萨,更是在濱河造成了極大的恐慌,老刑警劉巖菊卷,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缔恳,死亡現(xiàn)場離奇詭異,居然都是意外死亡洁闰,警方通過查閱死者的電腦和手機(jī)歉甚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扑眉,“玉大人纸泄,你說我怎么就攤上這事⊙兀” “怎么了聘裁?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長耸弄。 經(jīng)常有香客問我咧虎,道長,這世上最難降的妖魔是什么计呈? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任砰诵,我火速辦了婚禮,結(jié)果婚禮上捌显,老公的妹妹穿的比我還像新娘茁彭。我一直安慰自己,他們只是感情好扶歪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布理肺。 她就那樣靜靜地躺著摄闸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪妹萨。 梳的紋絲不亂的頭發(fā)上年枕,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機(jī)與錄音乎完,去河邊找鬼熏兄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛树姨,可吹牛的內(nèi)容都是我干的摩桶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼帽揪,長吁一口氣:“原來是場噩夢啊……” “哼硝清!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起转晰,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤芦拿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后挽霉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體防嗡,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年侠坎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚁趁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡实胸,死狀恐怖他嫡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庐完,我是刑警寧澤钢属,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站门躯,受9級特大地震影響淆党,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讶凉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一染乌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧懂讯,春花似錦荷憋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽串前。三九已至,卻和暖如春实蔽,著一層夾襖步出監(jiān)牢的瞬間荡碾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工局装, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留玩荠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓贼邓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闷尿。 傳聞我的和親對象是個(gè)殘疾皇子塑径,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容