题目描述:
数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。
输入描述:
输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的。
输出描述:
输出九行,每行九个空格隔开的数字,为解出的答案。
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext())
{
int[][] arr = new int[9][9];
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
arr[i][j] = scanner.nextInt();
}
}
next(arr, 0, 0);
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (j < 8)
System.out.print(arr[i][j] + " ");
else
System.out.print(arr[i][j]);
}
System.out.println();
}
}
}
public static boolean next(int[][] arr, int i, int j)
{
while (arr[i][j] != 0)
{
if (j < 8)
j++;
else if (i < 8)
{
i++;
j = 0;
}
else
return true;
}
for (int k = 1; k <= 9; k++)
{
arr[i][j] = k;
if (status(arr, i, j))
{
if (!next(arr, i, j))
continue;
return true;
}
}
arr[i][j] = 0;
return false;
}
public static boolean status(int[][] arr, int i, int j) // flase 表示不符合要求
{
int tmp = arr[i][j];
for (int k = 0; k < 9; k++)
{
if (k != j && arr[i][k] == tmp)
return false;
}
for (int k = 0; k < 9; k++)
{
if (k != i && arr[k][j] == tmp)
return false;
}
int bi = i / 3 * 3;
int bj = j / 3 * 3;
for (int ii = bi; ii < bi +3; ii++)
{
for (int jj = bj; jj < bj + 3; jj++)
{
if (ii == i && jj == j)
continue;
if (arr[ii][jj] == arr[i][j])
return false;
}
}
return true;
}
}