本质上就是给定一个 $9\times9$ 的二维矩阵,使用1-9对该二维矩阵进行补全。在补全矩阵后需要保证,在矩阵的每一行每一列中都不存在重复元素。并且在9个 $3\times3$ 的小方框中不存在重复的元素。并且这样的求解有且仅有一个。
采取逐行放置的方式:设计一个递归地回溯函数 bool backtrack(int row,int col,vector<vector<char>>& board)
,向函数传递的参数值为 row
行号和 col
列号,每一次仅填写 board[row][col]
位置处的元素,返回值为bool类型,表示本地递归是否找到了可行的解。首先判断 board[row][col]
位置处的元素是否是 .
若不是,则直接 col+1
向下递归,并且直接返回递归函数的返回值。
若是则使用一个hash used[9]
记录,在 board[row][col]
处那些元素是使用过的。首先是按行列进行统计,再按 $3\times3$ 的宫格进行统计。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| bool used[9]={false}; for(int i=0;i<board[row].size();i++){ if(board[row][i]!='.') used[board[row][i]-'1']=true; } for(int i=0;i<board.size();i++){ if(board[i][col]!='.') used[board[i][col]-'1']=true; }
for(int i=row/3*3;i<row/3*3+3;i++){ for(int j=col/3*3;j<col/3*3+3;j++){ if(board[i][j]!='.') used[board[i][j]-'1']=true; } }
|