人麻了, 同一道题 在头歌提交直接判超时, 在洛谷通过 前3个测试点,
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String [][]str = new String[9][]; // 使用字符串数组结束
for(int i = 0; i < str.length; i++) {
str[i] = sc.nextLine().split(" "); // 整行接收
}
Main main = new Main();
main.dfs(str, 0, 0);
}
public void dfs(String arr[][], int x, int y) {
// 到达末尾
if(x == 9) {
print(arr);
System.exit(0);
}
if(arr[x][y].equals("0")) {
boolean loop;
for(int i = 1; i <= 9; i++) {
String num = "" + i; // 转为string
// 调用check验证 该数字是否合适
loop = check(arr, x, y, num);
if(loop) {
arr[x][y] = num;
// 是否到该行末尾
dfs(arr, x+ (y + 1) / 9, (y + 1) % 9);
}
}
// 循环结束 回溯
arr[x][y] = "0";
} else {
dfs(arr, x+ (y + 1) / 9, (y + 1) % 9);
}
}
public boolean check(String[][] arr, int x, int y, String num) {
// 验证 行列是否有重复 数字
for(int i = 0; i < 9; i++) {
// 验证同一列
if(arr[i][y].equals(num)) {
return false;
}
// 同一行
if(arr[x][i].equals(num)) {
return false;
}
}
// 验证 同一个小九宫格是否有 重复
for(int i = (x / 3)*3; i < (x / 3 + 1)*3; i++) {
for(int j = (y / 3)*3; j < (y / 3 + 1)*3; j++) {
if(arr[i][j].equals(num))
return false;
}
}
return true;
}
// 遍历输出方法
public void print(String [][]arr) {
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++) {
if(j == 8) {
System.out.print(arr[i][j]);
} else {
System.out.print(arr[i][j] + " ");
}
}
System.out.println();
}
}
}