非静态方法递归时使用全局静态方法有什么问题吗?跪求大佬指教!
(Leecode 37题)编写一个程序,通过填充空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 '.' 表示。

#笔试题目#
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 '.' 表示。
提示:
- 给定的数独序列只包含数字 1-9 和字符 '.' 。
- 你可以假设给定的数独只有唯一解。
- 给定数独永远是 9x9 形式的。
为什么全局变量不能用static修饰,比如这里用static修饰后(
private static int[]row = new int[9];
private static int[]col = new int[9];
private static int[][]block = new int[3][3];
private static boolean valid = false;
private static List<int[]> workPosition = new ArrayList<>();
),案例就不通过;不通过案例如下
解法是官方解法的方法三如下:
class Solution {
private int[]row = new int[9];
private int[]col = new int[9];
private int[][]block = new int[3][3];
private boolean valid = false;
private List<int[]> workPosition = new ArrayList<>();
public void solveSudoku(char[][] board) {
for(int i = 0; i<9; i++){
for(int j=0; j<9; j++){
if(board[i][j]!='.'){
int digit = board[i][j]-'0'-1;
recordNum(digit,i,j);
}
}
}
while(true){
boolean isExit = false;
for(int i = 0; i<9; i++){
for(int j=0; j<9; j++){
if(board[i][j]=='.'){
int mask = ~(row[i] | col[j] | block[i/3][j/3]) & 0x1ff;
if((mask & (mask-1)) == 0){
int digit = Integer.bitCount(mask-1);
recordNum(digit,i,j);
board[i][j] = (char)(digit+'0'+1);
isExit = true;
}
}
}
}
if(!isExit){
break;
}
}
for(int i=0; i<9; i++){
for(int j=0; j<9; j++){
if(board[i][j] == '.'){
workPosition.add(new int[]{i,j});
}
}
}
dfs(board,0);
}
private void dfs(char[][]board, int pos){
if(pos == workPosition.size()){
valid = true;
return;
}
int[] posxy = workPosition.get(pos);
int i = posxy[0];
int j = posxy[1];
int mask = ~(row[i] | col[j] | block[i/3][j/3]) & 0x1ff;
for(;mask!=0 && !valid; mask &=(mask-1)){
int digitMask = mask & (-mask);
int digit = Integer.bitCount(digitMask-1);
recordNum(digit,i,j);
board[i][j] = (char)(digit+'0'+1);
dfs(board,pos+1);
recordNum(digit,i,j);
}
}
private void recordNum(int digit,int i, int j){
row[i] ^= (1<<digit) ;
col[j] ^= (1<<digit);
block[i/3][j/3] ^= (1<<digit);
}
}
#笔试题目#