LeetCode 36. Sudoku Solver

数独规则:

考察每行、每列、以及九个九宫格中的任意一个(题中已用粗线分割),都不包含重复的数字(即至多只有一个1, 2, 3, ..., 9)


这题可用递归来解,题目表示可以假设有唯一解,那么输入必然合法。

我们只要每次修改一个格子时,去验证这次修改是否合法即可(同时递归新的board, 并判断dfs的返回值是true还是false)


代码:

class Solution 
{
public:
    void solveSudoku(vector<vector<char> > &board) 
    {
		dfs(board);
    }
private:
	bool dfs(vector<vector<char> > &board)
	{
		for (int i = 0; i < 9; ++ i)
		{
			for (int j = 0; j < 9; ++ j)
			{
				if (board[i][j] != '.')
				{
					continue;
				} 
				for (int k = 1; k <= 9; ++ k)
				{
					board[i][j] = k+48;
					if (is_valid(board, i, j) && dfs(board))
					{
						return true;
					}
					board[i][j] = '.';
				}
				return false;
			}
		}
		return true;
	}
	bool is_valid(vector<vector<char> > &board, int x, int y)
	{
		for (int j = 0; j < 9; ++ j)
		{
			if ( j!=y && board[x][j]==board[x][y] )
			{
				return false;
			}
		}
		for (int i = 0; i < 9; ++ i)
		{
			if ( i!=x && board[i][y]==board[x][y] )
			{
				return false;
			}
		}
		for (int i = 3*(x/3); i < 3*(x/3)+3; ++ i)
		{
			for (int j = 3*(y/3); j < 3*(y/3)+3; ++ j)
			{
				if ( i!=x && j!=y && board[i][j]==board[x][y] )
				{
					return false;
				}
			}
		}
		return true;
	}
};


你可能感兴趣的:(LeetCode,C++,DFS)