數獨求解(深搜)

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("");
			}
		}
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章