主要思想
首先在第一排随即排列九个不一样得数。
然后在其他后面就用回溯法,值从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;
}
}
数独算法(java实现)
最新推荐文章于 2023-08-09 19:20:45 发布