判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
1-9
在每一行只能出现一次。1-9
在每一列只能出现一次。1-9
在每一个以粗实线分隔的 3x3
宫内只能出现一次。上图是一个部分填充的有效的数独。
数独部分空格内已填入了数字,空白格用 '.'
表示。
示例 1:
输入: [ ["5","3",".",".","7",".",".",".","."], ["6",".",".","1","9","5",".",".","."], [".","9","8",".",".",".",".","6","."], ["8",".",".",".","6",".",".",".","3"], ["4",".",".","8",".","3",".",".","1"], ["7",".",".",".","2",".",".",".","6"], [".","6",".",".",".",".","2","8","."], [".",".",".","4","1","9",".",".","5"], [".",".",".",".","8",".",".","7","9"] ] 输出: true
示例 2:
输入: [ ["8","3",".",".","7",".",".",".","."], ["6",".",".","1","9","5",".",".","."], [".","9","8",".",".",".",".","6","."], ["8",".",".",".","6",".",".",".","3"], ["4",".",".","8",".","3",".",".","1"], ["7",".",".",".","2",".",".",".","6"], [".","6",".",".",".",".","2","8","."], [".",".",".","4","1","9",".",".","5"], [".",".",".",".","8",".",".","7","9"] ] 输出: false 解释: 除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。
public boolean isValidSudoku(char[][] board) {
boolean flag = false;
List> listvec = new ArrayList>();
for (int j = 0; j < board.length / 3; j++) {
List quyulist = new ArrayList();
for (int k = j * 3; k < ((j + 1) * 3); k++) {
quyulist.add(k);
}
listvec.add(quyulist);
}
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[i].length; j++) {
if (board[i][j]!='.') {
int row = i;
int column = j;
// 单行
flag = false;
for (int k = 0; k < board.length; k++) {
if (k != i) {
if (board[k][column] == board[i][j]) {
flag = true;
break;
}
}
}
if (flag) {
return false;
}
// 单列
for (int k = 0; k < board.length; k++) {
if (k != j) {
if (board[row][k] == board[i][j]) {
flag = true;
break;
}
}
}
if (flag) {
return false;
}
// 3*3
List rowquyu = new ArrayList();
List colquyu = new ArrayList();
for (int k = 0; k < listvec.size(); k++) {
List listone = listvec.get(k);
if (listone.contains(row)) {
rowquyu = listone;
}
if (listone.contains(column)) {
colquyu = listone;
}
}
for (int k = 0; k < rowquyu.size(); k++) {
for (int k2 = 0; k2 < colquyu.size(); k2++) {
flag = false;
if (rowquyu.get(k) != i && colquyu.get(k2) != j) {
if (board[rowquyu.get(k)][colquyu.get(k2)] == board[i][j]) {
flag = true;
break;
}
}
}
if (flag) {
break;
}
}
if (flag) {
break;
}
}
if (flag) {
break;
}
}
if (flag) {
break;
}
}
if(flag)
{
return false;
}
return true;
}