黑马程序员技术交流社区
标题:
还需要完善的数独解法,还存在一个bug 求大神
[打印本页]
作者:
knockout
时间:
2015-9-5 01:11
标题:
还需要完善的数独解法,还存在一个bug 求大神
import java.util.Scanner;
class ShuDu
{
public static void main(String[] args)
{
int[][] arr=new int[9][9];
Scanner sc =new Scanner(System.in);
for(int row=1;row<=9;row++)
{
System.out.println("请输入第"+row+"行的数据,未知数以0代替。");
for (int col=1;col<=9 ;col++ )
{
arr[row-1][col-1]=sc.nextInt();
}
}
System.out.println("初始数独为:");
arrayPrint(arr);
int[][] flag0=new int[9][9];
for (int i=0;i<9 ;i++ )
{
for (int j=0;j<9 ;j++ )
{
if (arr[i][j]==0)
{
flag0[i][j]=1; // 以一个int数组空值位,1代表需要填写数字。
}
}
}
fuZhi(arr,flag0);
}
public static void arrayPrint(int[][] arr) //打印数组函数。
{
System.out.println("----------------------------------");
for(int i=0;i<arr.length;i++)
{
for (int j=0;j<arr[i].length ;j++ )
{
System.out.print(arr[i][j]+"\t");
if((j+1)%3==0)
{
System.out.print("|\t");
}
}
System.out.println();
if((i+1)%3==0)
{
System.out.println("----------------------------------");
}
}
}
public static void fuZhi(int[][] arr,int[][] flag0)
{
for (int i=0;i<9 ;i++ )
{
for (int j=0;j<9 ;j++ )
{
if (flag0[i][j]==1)
{
while(arr[i][j]==0||judgeArray(arr,i,j)==false)
{
arr[i][j]++;
i1:if(arr[i][j]>9)
{
for(int m=i;m>=0;m--)
{
for(int n=j-1;n>=0;n--)
{
if(flag0[m][n]==1)
{
arr[m][n]++;
break i1;
}
}
}
}
}
}
}
}
arrayPrint(arr);
}
public static boolean judgeArray(int[][] arr,int x,int y)
{
int[][] arr2=new int[3][3]; //获取arr[x][y]所在的9个小方块 并且赋值给arr2【】【】。
int flag1=0,flag2=0,flag3=0;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
arr2[i][j]=arr[3*(x/3)+i][3*(y/3)+j];
}
}
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(arr[x][y]==arr2[i][j]) //判断a[x][y]所在的3*3小块中有没有重复。
{
flag3++;
}
}
}
for(int i=0;i<9;i++) //判断a[][]所在的行除去0以外没有重复。
{
if (arr[x][y]==arr[x][i])
{
flag1++;
}
}
for(int i=0;i<9;i++) // 判断a[][]所在的列除去0以外的没有重复
{
if (arr[x][y]==arr[i][y])
{
flag2++;
}
}
if(flag1>1||flag2>1||flag3>1) // 如果以上3个条件有一个重复的,就返回false。
{
return false;
}
else
{
return true;
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2