import java.util.*; public class SudokuSol { /**待求解数独,输入时,待填框中填0**/ static int[][] Matrix=null; /**对框中数字的标记,ind[i][j]==1,表示数字是固定的,ind[i][j]==0,数字是待填的**/ static int[][] ind=null; /**标记是否找到答案**/ static boolean flag=false; /** * 输入,例子: * 0 0 0 0 0 0 0 0 7 * 8 0 0 0 4 0 0 0 0 * 0 5 0 0 0 0 0 0 9 * 0 9 0 0 0 5 0 0 0 * 0 0 0 0 2 0 1 4 0 * 0 0 0 0 0 0 0 0 0 * 4 0 1 0 0 0 8 0 0 * 0 0 0 0 0 7 0 0 0 * 0 0 0 0 0 9 0 6 5 * @return */ static int[][] inputMatrix() { Matrix=new int[9][9]; ind=new int[9][9]; Scanner in=new Scanner(System.in); for(int i=0;i<9;i++) for(int j=0;j<9;j++) { Matrix[i][j]=in.nextInt(); if(Matrix[i][j]!=0) ind[i][j]=1; else ind[i][j]=0; } return Matrix; } /**搜索时的条件判断**/ static boolean check(int i,int j) { int i_temp=i/3,j_temp=j/3; /**每一列不可有重复**/ boolean flag1=true; for(int k=0;k<9;k++) if(k==i) continue; else if(Matrix[k][j]==Matrix[i][j]) flag1=false; /**每一行不可有重复**/ boolean flag2=true; for(int k=0;k<9;k++) if(k==j) continue; else if(Matrix[i][k]==Matrix[i][j]) flag2=false; /**每一个小方格中不可有重复**/ boolean flag3=true; for(int l=0;l<3;l++){ for(int k=0;k<3;k++) { if(i_temp*3+l==i&&j_temp*3+k==j) continue; if(Matrix[i_temp*3+l][j_temp*3+k]==Matrix[i][j]) flag3=false; } } return flag1&&flag2&&flag3; } /**** * 深搜主体 * @param Matrix * @param i * @param j */ static void DFS(int[][] Matrix,int i,int j) { /**Matrix[i][j]是输入中固定的数字,进行下一步搜索**/ if((i<=8&&j<=8)&&ind[i][j]==1) { if(j!=8) DFS(Matrix,i,j+1); else if(j==8&&i<=8) DFS(Matrix,i+1,0); } else { /**已经搜索结束**/ if(i==9&&j==0) { flag=true; return; } for(int k=1;k<=9;k++) { if(Matrix[i][j]==0) { Matrix[i][j]=k; if(check(i,j)) { if(j==8&&i<=8) DFS(Matrix,i+1,0); else if(j!=8) DFS(Matrix,i,j+1); if(flag==true) return; } /**还原现场**/ Matrix[i][j]=0; } } } } public static void main(String[] args) { Matrix=inputMatrix(); flag=false; DFS(Matrix,0,0); if(flag==true) { System.out.println("-----Answer-----"); for(int i=0;i<9;i++) { for(int j=0;j<9;j++) if(j==0) System.out.print(Matrix[i][j]); else System.out.print(" "+Matrix[i][j]); System.out.println(""); } } } }
数独求解(深搜)
最新推荐文章于 2024-10-05 18:48:50 发布