每日一题——37.解数独
题目链接:37. 解数独 - 力扣(LeetCode)
代码:
class Solution {
public:
bool isvalied(int i,int j,char k,vector<vector<char>>board)
{
//行合法
for(int row = 0;row < board.size();row++)
{
if(board[row][j] == k) return false;
}
//列合法
for(int col = 0;col < board[0].size();col++)
{
if(board[i][col] == k) return false;
}
//九宫格合法
int startrow = (i/3) * 3;
int startcol = (j/3) * 3;
for(int row = startrow;row < startrow+3;row++)
{
for(int col = startcol;col < startcol+3;col++)
{
if(board[row][col] == k) return false;
}
}
return true;
}
bool traversal(vector<vector<char>>& board)
{
for(int i = 0; i < board.size();i++)
{
for(int j = 0; j < board[0].size();j++)
{
if(board[i][j] != '.') continue;
for(char k = '1';k <= '9';k++)
{
if(isvalied(i,j,k,board))
{
board[i][j] = k;
if(traversal(board)) return true;
board[i][j] = '.';
}
}
return false;
}
}
return true; //有必要吗
}
void solveSudoku(vector<vector<char>>& board) {
traversal(board);
}
};
回溯三部曲:
直接引用传入board ,修改board的数值
返回return bool值,判断当前路劲是否合法
这里我纠结的问题是为什么前面return false和return true的情况都有了,结尾还要再返回return true
--在所有棋盘都填满了的情况下,就不会在走到后面的路劲判断true和false的情况了,这时棋盘都满了,则是找到了合法解,在最后的部分就return true;;;;
;;;;;;