1. 程式人生 > 其它 >LeetCode 37. 解數獨(dfs)

LeetCode 37. 解數獨(dfs)

技術標籤:dfs

問題描述

編寫一個程式,通過填充空格來解決數獨問題。

一個數獨的解法需遵循如下規則:

數字 1-9 在每一行只能出現一次。
數字 1-9 在每一列只能出現一次。
數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。
空白格用 ‘.’ 表示。
在這裡插入圖片描述
一個數獨。
在這裡插入圖片描述
答案被標成紅色。

提示:

給定的數獨序列只包含數字 1-9 和字元 ‘.’ 。
你可以假設給定的數獨只有唯一解。
給定數獨永遠是 9x9 形式的。

思路

爆搜

AC程式碼

class Solution {
public:
    bool row[9][9], col[9][9], cell[3][3]
[9]; void solveSudoku(vector<vector<char>>& board) { memset(row, 0, sizeof row); memset(col, 0, sizeof col); memset(cell, 0, sizeof cell); for (int i = 0; i < 9; i ++) for (int j = 0; j < 9; j ++) if (board[i][j] != '.'
) { int t = board[i][j] - '1'; row[i][t] = col[j][t] = cell[i / 3][j / 3][t] = true; } dfs(board, 0, 0); } bool dfs(vector<vector<char>> &board, int x, int y) { if (y == 9) y = 0, x ++; if (x == 9) return
true; if (board[x][y] != '.') return dfs(board, x, y + 1); for (int i = 0; i < 9; i ++) { if (!row[x][i] && !col[y][i] && !cell[x / 3][y / 3][i]) { board[x][y] = '1' + i; row[x][i] = col[y][i] = cell[x / 3][y / 3][i] = true; if (dfs(board, x, y + 1)) return true; board[x][y] = '.'; row[x][i] = col[y][i] = cell[x / 3][y / 3][i] = false; } } return false; } };