数独求解(深搜)

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值