解数独(Java)
说明:输出数据,0代表要填的数
源代码
import java.util.*;
public class ShuDu {
static int[][] arr = new int[9][9];
static int h=0, l=0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 9; i++) {
String t = sc.nextLine();
for(int j=0; j<9; j++)arr[i][j] = Integer.parseInt(t.substring(j, j+1));
}
sc.close();
dfs();
}
// 递归操作,深度搜索
static void dfs(){
if(arr[h][l]==0){
for (int i = 1; i < 10; i++) {
arr[h][l] = i;
if(none_repeat_rc(h, l) && none_repeat_cell(h/3*3, l/3*3, h, l)){
int t_h = h, t_l = l;
if(!move()) return;
else{
dfs();
arr[t_h][t_l] = 0;
h = t_h; l = t_l;
}
}else arr[h][l] = 0;
}
}else{
if(!move()) return;
dfs();
}
}
// 下一格递归
static boolean move(){
if(l==arr.length-1){
if(h!=arr.length-1){h++;l=0;}
else{ print(); return false; }
}else l++;
return true;
}
// 输出结果
static void print(){
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++)
System.out.print(arr[i][j]);
System.out.println();
}
System.out.println();
}
// 行列无重复
static boolean none_repeat_rc(int h, int l){
for (int i = 0; i < arr.length; i++) {
if(i==h)continue;
if(arr[i][l]==arr[h][l]) return false;
}
for (int i = 0; i < arr.length; i++) {
if(i==l)continue;
if(arr[h][i]==arr[h][l]) return false;
}
return true;
}
// 3*3方格格内无重复
static boolean none_repeat_cell(int start_h, int start_l, int h, int l){
for (int i = start_h; i < start_h+3; i++) {
for (int j = start_l; j < start_l+3; j++) {
if(i==h && j==l)continue;
if(arr[i][j]==arr[h][l]) return false;
}
}
return true;
}
}
结果截图: