得用到DFS,一条路走到黑;
做这道题得时候一直在想 如何在line / 9 == 1
的时候直接返回呢 开始准备用goto 后来改变主意设一个flag就行了
bool flag = false;
bool check(vector<vector<char>> &vec, int line, int col, char value) //检查这个值能不能被放入
{
for (int i = 0; i < 9; i++)
{
if (vec[line][i] == value || vec[i][col] == value)
{
return false;
}
}
int x = line / 3 * 3, y = col / 3 * 3;
for (int i = 0; i <= 2; i++)//判断是否在它所在的九宫格重复
{
for (int j = 0; j <= 2; j++)
{
if (vec[x + i][y + j] == value)
return false;
}
}
return true;
}
void dfs(vector<vector<char>> &vec, int line, int col)
{
//boundary condition
if (line / 9 == 1) //每行每列都弄完了
{
flag = true;
return;
}
if (vec[line][col] == '.') //如果这是入口
{
for (int k = 1; k <= 9; k++) //k从1到9挨个尝试
{
if (check(vec, line, col, k + '0')) //如果K可以放进去
{
vec[line][col] = k + '0';
dfs(vec, line + (col + 1) / 9, (col + 1) % 9); //下一位置进行dfs
}
}
if (!flag)
vec[line][col] = '.'; //回溯
}
else
{
dfs(vec, line + (col + 1) / 9, (col + 1) % 9);
}
}
void solveSudoku(vector<vector<char>> &board)
{
dfs(board, 0, 0);
}