标签:sudo load hashset bool 取值 cte boa 哈希表 rac
这题的思路也比较清晰,三个判断规则内部的逻辑都是相同的,可以提取出来做成一个单独的方法:boolean check(char[] chars)
题目有“只能出现一次”这种字眼,一般都要用到哈希表,这里的boolean check(char[] chars)刚好可以用到
1 private static boolean check(char[] chars) { 2 HashSet<Character> set = new HashSet<>(); 3 for (int i = 0; i < chars.length; i++) { 4 //‘.‘不能进入判断 5 if (chars[i] != ‘.‘) { 6 if (!set.contains(chars[i])) { 7 set.add(chars[i]); 8 } else { 9 return false; 10 } 11 } 12 } 13 return true; 14 } 15 16 public static boolean isValidSudoku(char[][] board) { 17 //检查:数字 1-9 在每一行只能出现一次。 18 for (int i = 0; i < board.length; i++) { 19 if (check(board[i]) == false) { 20 return false; 21 } 22 } 23 //检查:数字 1-9 在每一列只能出现一次。 24 char[] tmp = new char[9]; 25 for (int i = 0; i < 9; i++) { 26 for (int j = 0; j < 9; j++) { 27 tmp[j] = board[j][i]; 28 } 29 if (check(tmp) == false) { 30 return false; 31 } 32 } 33 //检查:数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 34 //三行三列 35 for (int i = 0; i < 3; i++) { 36 //第i行,第j列的3*3宫 37 for (int j = 0; j < 3; j++) { 38 //接着遍历3*3宫内部所有元素 39 //定位左上角元素的坐标(x,y),取值如下 40 //0,0;0,3;0,6; 41 //3,0;3,3;3,6; 42 //6,0;6,3;6,6; 43 //填充tmp[]数组的光标 44 int index=0; 45 int x = i * 3, y = j * 3; 46 for (int k = x; k < x+3; k++) { 47 for (int l = y; l < y+3; l++) { 48 tmp[index++]=board[k][l]; 49 } 50 } 51 if (check(tmp)==false){ 52 return false; 53 } 54 } 55 } 56 //经过以上三项检查,肯定返回true了 57 return true; 58 }
运行结果:
标签:sudo load hashset bool 取值 cte boa 哈希表 rac
原文地址:https://www.cnblogs.com/gilgamesh-hjb/p/13340870.html