leetcode做题记录0037

leetcode 0037

说明

只是为了记录一下,不求多快,也不深究。

会简要描述思路,代码中不写注释。

如碰到不会做的用了别人代码会在博客中标出。

题目描述

在这里插入图片描述

参考

做法参考自B站up主:花花酱LeetCode的视频讲解,链接如下:

花花酱 LeetCode 37. Sudoku Solver - 刷题找工作 EP89

思路

能否填某数字要根据所在位置的行、列和33方格确定是否含有这个数字。

因此定义三个二维数组rowStatus、colStatus和boxStatus记录某一行某一列或某一方格中该数字是否已有。

然后一个格子一个格子的遍历,看下这个格子能填什么数,能填则填,填完后看新的数独是否有解,无解则回溯,试一下剩下的选择。

直至将数独填完。

class Solution {
    public void solveSudoku(char[][] board) {
		boolean[][] rowStatus = new boolean[9][9];
		boolean[][] colStatus = new boolean[9][9];
		boolean[][] boxStatus = new boolean[9][9];
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				if (board[i][j] == '.') {
					continue;
				}
				int temp = board[i][j] - '0' - 1;
				rowStatus[i][temp] = true;
				colStatus[j][temp] = true;
				boxStatus[(i / 3) * 3 + j / 3][temp] = true;
			}
		}
		fillSudoku(board, 0, 0, rowStatus, colStatus, boxStatus);
	}

	public boolean fillSudoku(char[][] board, int col, int row, boolean[][] rowStatus, boolean[][] colStatus,
			boolean[][] boxStatus) {
		int nextCol = (col + 1) % 9;
		int nextRow = nextCol == 0 ? row + 1 : row;
		if (row == 9) {
			return true;
		}
		if (board[row][col] != '.') {
			return fillSudoku(board, nextCol, nextRow, rowStatus, colStatus, boxStatus);
		}
		for (int i = 1; i < 10; i++) {
			if (rowStatus[row][i - 1] || colStatus[col][i - 1] || boxStatus[(row / 3) * 3 + col / 3][i - 1]) {
				continue;
			} else {
				rowStatus[row][i - 1] = true;
				colStatus[col][i - 1] = true;
				boxStatus[(row / 3) * 3 + col / 3][i - 1] = true;
				board[row][col] = (char) (i + 48);
				if (fillSudoku(board, nextCol, nextRow, rowStatus, colStatus, boxStatus)) {
					return true;
				} else {
					rowStatus[row][i - 1] = false;
					colStatus[col][i - 1] = false;
					boxStatus[(row / 3) * 3 + col / 3][i - 1] = false;
					board[row][col] = '.';
				}
			}
		}
		return false;
	}
}
发布了77 篇原创文章 · 获赞 1 · 访问量 2056

猜你喜欢

转载自blog.csdn.net/Paul_1i/article/details/105116738