【Leetcode】37. 解数独

题目:解数独

题意:给定一个9*9的不完全数独矩阵,需要在 ‘.’ 的地方填入合适的数字(1-9),使得每一行、每一列以及每一个子方块没有重复的数字出现

思路:回溯

           对每一行、每一列以及每一个子方块设置一个标志数组,标志已经存放过哪些数字。从矩阵的第一个格开始处理,直到最后一个格结束。

代码:

class Solution {
private:
	int flag[3][9][10];      //0记录行  1记录列  2记录子迷宫
	int N = 9;
public:
	void solveSudoku(vector<vector<char>>& board) {         //初始化标志数组
		memset(flag, 0, (3 * 9 * 10) * sizeof(int));
		for(int i = 0; i < N; i++)
			for (int j = 0; j < N; j++) {
				if (board[i][j] != '.') {
					int k = i / 3 * 3 + j / 3;
					int temp = board[i][j] - '0';
					flag[0][i][temp]++;
					flag[1][j][temp]++;
					flag[2][k][temp]++;
				}
			}
		backtracking(board, 0, 0);
	}
	bool backtracking(vector<vector<char>>& board, int row, int col) {
		if (col == N) {
			row++;
			col = 0;
			if (row == N)
				return true;    //如果所有的'.'已经全部填入数字,则返回True
		}
		if (board[row][col] == '.') {
			for (int i = 1; i <= N; i++) {
				int k = row / 3 * 3 + col / 3;
				if (!(flag[0][row][i] || flag[1][col][i] || flag[2][k][i])) {
					flag[0][row][i]++;
					flag[1][col][i]++;
					flag[2][k][i]++;
					board[row][col] = '0' + i;
					if (backtracking(board, row, col + 1))return true;
					board[row][col] = '.';
					flag[0][row][i]--;
					flag[1][col][i]--;
					flag[2][k][i]--;
				}
			}
			return false;
		}
		return backtracking(board, row, col + 1);
	}
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值