LeetCode 37-解数独
Note:
给定的数独序列只包含数字 1-9 和字符 ‘.’ 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。
https://leetcode-cn.com/problems/sudoku-solver/
题解
显然要递归回溯啦,逻辑很清楚,就是怎么把解传过去把我坑惨了,因为只有跑完最后一个点正确才是答案,中途跑到一边跑不下去得其实都没用,但这个用引用传值就很难受,不得已设置了一个ans起到全局变量得作用。
class Solution {
public:
vector<vector<char>> ans;
bool check(vector<vector<char>>& board, int x, int y, int num){//检查行、列、格
bool can=true;
int gridx=x/3;//确定是哪个九宫格
int gridy=y/3;
for(int i=0;i<9;i++){
if(board[x][i]-'0'==num||board[i][y]-'0'==num||board[gridx*3+i/3][gridy*3+i%3]-'0'==num){
can=false;
break;
}
}
return can;
}
void nextstep(vector<vector<char>>& board, int index){//index表示试探到第几个点
int x=index/9;//利用index获得行号和列号
int y=index%9;
if(index>80){
ans=board;
return;
}
else{
if(board[x][y]=='.'){
for(int num=1;num<=9;num++){
if(check(board,x,y,num)){
board[x][y]=(char(num+'0'));
nextstep(board, (index+1));//递归
board[x][y]='.';//回溯
}
}
}
else{
nextstep(board, index+1);
}
}
}
void solveSudoku(vector<vector<char>>& board) {
nextstep(board,0);
board=ans;
}
};
LeetCode37 解数独
本文介绍了解决LeetCode37题目“解数独”的算法实现,采用递归回溯的方法,通过检查行、列和九宫格的合法性来填充数独。详细解释了如何避免重复解和无效解,确保最终得到的是数独的唯一正确解答。
447

被折叠的 条评论
为什么被折叠?



