问题描述
- 想问下这个方法的执行流程?谢谢大神指导
-
private boolean isValid(int[][] game, int index, int[] numberOfSolutions) {
if (index > 80)
return ++numberOfSolutions[0] == 1;int x = index % 9; int y = index / 9; if (game[y][x] == 0) { List<Integer> numbers = new ArrayList<Integer>(); for (int i = 1; i <= 9; i++) numbers.add(i); while (numbers.size() > 0) { int number = getNextPossibleNumber(game, x, y, numbers); if (number == -1) break; game[y][x] = number; if (!isValid(game, index + 1, numberOfSolutions)) { game[y][x] = 0; return false; } game[y][x] = 0; } } else if (!isValid(game, index + 1, numberOfSolutions)) return false; return true; }
解决方案
private boolean isValid(int[][] game, int index, int[] numberOfSolutions) {
if (index > 80)
return ++numberOfSolutions[0] == 1;//如果大于80,先numberOfSolutions[0] 加1后与1比较,返回布尔值
int x = index % 9;//如果不大于80,从这里开始执行
int y = index / 9;
if (game[y][x] == 0) {
List<Integer> numbers = new ArrayList<Integer>();
for (int i = 1; i <= 9; i++)
numbers.add(i);
while (numbers.size() > 0) {
int number = getNextPossibleNumber(game, x, y, numbers);
if (number == -1)
break;
game[y][x] = number;
if (!isValid(game, index + 1, numberOfSolutions)) {
game[y][x] = 0;
return false;
}
game[y][x] = 0;
}
} else if (!isValid(game, index + 1, numberOfSolutions))
return false;
return true;
}
解决方案二:
9x9方格,递归检测,每次index+1, 相当于先行后列的顺序访问。跳出递归的条件有:
1. index>80,代表所有方格都检查完了。根据numberOfSolutions[0]返回true或者false
2. number == -1 break出while循环了。这个循环外是返回true的。
3. isValid(index+1) 递归检查下一个格子。
只能说这么多了。
自己慢慢琢磨。
时间: 2024-09-29 05:33:16