package class_2022_03_4_week; // 来自网易 // 不规则数独问题 // 3*3填数独 // 每一行要填1~3 // 每一列要填1~3 // 3*3的区域会拆分成不规则的三个集团区域 // 每个集团区域3个格子 // 每个集团的区域都一定是一个连在一起的整体,可能不规则 // 每个集团内要填1~3 // 如果只有一个解返回"Unique",如果有多个解返回"Multiple",如果没有解返回"No" // 解析请看,大厂刷题班,28节,leetcode原题,数独那两个题 // 本题就是改变一下桶的归属而已 public class Code07_IrregularSudoku { // sudoku[i][j] == 0,代表这个位置没有数字,需要填 // sudoku[i][j] != 0,代表这个位置有数字,不需要填 // map[0] = {0,0}、{0,1}、{1,0} 代表0集团拥有的三个点 // map[i] = {a,b}、{c,d}、{e,f} 代表i集团拥有的三个点 public static String solution(int[][] sudoku, int[][][] map) { boolean[][] row = new boolean[3][4]; boolean[][] col = new boolean[3][4]; boolean[][] bucket = new boolean[3][4]; int[][] own = new int[3][3]; for (int i = 0; i < 3; i++) { for (int[] arr : map[i]) { own[arr[0]][arr[1]] = i; } } for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (sudoku[i][j] != 0) { row[i][sudoku[i][j]] = true; col[j][sudoku[i][j]] = true; bucket[own[i][j]][sudoku[i][j]] = true; } } } int ans = process(sudoku, 0, 0, row, col, bucket, own); return ans == 0 ? "No" : (ans == 1 ? "Unique" : "Multiple"); } public static int process(int[][] sudoku, int i, int j, boolean[][] row, boolean[][] col, boolean[][] bucket, int[][] own) { if (i == 3) { return 1; } int nexti = j != 2 ? i : i + 1; int nextj = j != 2 ? j + 1 : 0; if (sudoku[i][j] != 0) { return process(sudoku, nexti, nextj, row, col, bucket, own); } else { int ans = 0; int bid = own[i][j]; for (int num = 1; num <= 3; num++) { if ((!row[i][num]) && (!col[j][num]) && (!bucket[bid][num])) { row[i][num] = true; col[j][num] = true; bucket[bid][num] = true; sudoku[i][j] = num; ans += process(sudoku, nexti, nextj, row, col, bucket, own); row[i][num] = false; col[j][num] = false; bucket[bid][num] = false; sudoku[i][j] = 0; if (ans > 1) { return ans; } } } return ans; } } public static void main(String[] args) { int[][] sudoku1 = { { 0, 2, 0 }, { 1, 0, 2 }, { 0, 0, 0 } }; int[][][] map1 = { { { 0, 0 }, { 0, 1 }, { 1, 0 } }, { { 0, 2 }, { 1, 1 }, { 1, 2 } }, { { 2, 0 }, { 2, 1 }, { 2, 2 } } }; System.out.println(solution(sudoku1, map1)); int[][] sudoku2 = { { 0, 0, 3 }, { 0, 0, 0 }, { 0, 0, 0 } }; int[][][] map2 = { { { 0, 0 }, { 1, 0 }, { 1, 1 } }, { { 0, 1 }, { 0, 2 }, { 1, 2 } }, { { 2, 0 }, { 2, 1 }, { 2, 2 } } }; System.out.println(solution(sudoku2, map2)); int[][] sudoku3 = { { 0, 0, 3 }, { 1, 0, 0 }, { 0, 0, 2 } }; int[][][] map3 = { { { 0, 0 }, { 1, 0 }, { 1, 1 } }, { { 0, 1 }, { 0, 2 }, { 1, 2 } }, { { 2, 0 }, { 2, 1 }, { 2, 2 } } }; System.out.println(solution(sudoku3, map3)); int[][] sudoku4 = { { 3, 0, 3 }, { 1, 0, 0 }, { 0, 0, 2 } }; int[][][] map4 = { { { 0, 0 }, { 1, 0 }, { 1, 1 } }, { { 0, 1 }, { 0, 2 }, { 1, 2 } }, { { 2, 0 }, { 2, 1 }, { 2, 2 } } }; System.out.println(solution(sudoku4, map4)); } }