数独算法(java实现)

主要思想
首先在第一排随即排列九个不一样得数。
然后在其他后面就用回溯法,值从1嫁到9,对了就前进,不对就继续,如果都试了一下还是不成功就后退。
废话不多说
import java.util.Random;




class shuZi {
	int [][]qiBan=new int[9][9];
	/*初始化函数*/
	public shuZi(){
		
		for(int i=0;i<9;i++){
			for(int j=0;j<9;j++){
				qiBan[i][j]=0;
			}
		}		
		qiBan[0][suiji()]=1;
		for(int i=2;i<10;i++){
			int a=suiji();
			while(qiBan[0][a]!=0){
				a=suiji();
			}
			qiBan[0][a]=i;
		}
		/*从第二排开始试点发*/
		int x=1,y=0;
		do{
			qiBan[x][y]++;/*如果没成功就每次加1,加到9,还是不行就要回退*/
			if(qiBan[x][y]==10){
				qiBan[x][y]=0;/*变成零*/
				y--;
				if(y<0){
					/*如果负一的话就要重新换一排*/
					x--;
					y=8;
				}
				continue;
			}
			/*如果成功Y就加一*/
			if(yanZheng(x,y,qiBan[x][y])){
				y++;
				if(y==9){
					x++;y=0;
				};//如果横排试完就要加1
			}
		}while(x<9);	
		
	}
	public void show(){//输出数组
		for(int i=0;i<9;i++){
			for(int j=0;j<9;j++){
				System.out.print(qiBan[i][j]);
				if(j==8) System.out.println("");
			}
		}
	}
	
	private int suiji(){//随即算法
		Random random = new Random();
		random.nextInt(20);
		return random.nextInt(9);
	}
	
	private Boolean yanZheng(int x,int y,int value){//验证算法
		for(int i=0;i<9;i++){
			if(i==y) continue;
			if(qiBan[x][i]==value) return false; //检查竖排
			
		}
		for(int i=0;i<9;i++){
			if(i==x) continue;
			if(qiBan[i][y]==value) return false; //检查横排
		}
		int n=x/3;//在那个横排九宫格
		int m=y/3;//在那个竖排九宫格
		for(int i=n*3;i<3*(n+1);i++){
			for(int j=m*3;j<3*(m+1);j++){
				if(x==i&&y==j) continue;
				if(qiBan[i][j]==value) return false;
			}
		}
		return true;
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值