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-12-26 17:23:38 发布