数独问题:9*9的矩阵,要求每一行,每一列,每个九宫格都是1-9这九个数字且不能重复。
给定一9*9矩阵,里面有部分数空缺,要求找出满足上述要求的一个矩阵。
如:
根据该单元格所在行、列以及所在单元的九宫格来确定当前位置可填写那些数字,分两种情况,1:只有一个数字可以填写。2:有多个数字可以填写。这里只有当该处填写数字唯一才可填写,循环上述步骤知道填写完。
源码:
package com.wyj.sudoku;
import java.util.Scanner;
/**
*
* @author wyj《经典算法》稳定婚姻匹配
* 题目:数独问题:9*9的矩阵,要求每一行,每一列,每个九宫格都是1-9这九个数字且不能重复。给定一9*9矩阵,里面有部分数空缺,要求找出满足上述要求的一个矩阵。
*
* 解题思路:根据该单元格所在行、列以及所在单元的九宫格来确定当前位置可填写那些数字,分两种情况,1:只有一个数字可以填写。2:有多个数字可以填写。这里只填写唯一数字
*/
public class suDoKu {
/*private static int[][] chess= {
{0,4,2,0,6,3,0,0,9},
{6,0,0,0,1,0,0,0,5},
{3,0,0,0,2,0,4,8,0},
{1,0,0,5,0,2,6,0,8},
{4,0,0,0,0,7,0,0,1},
{9,0,5,6,0,0,0,0,7},
{0,3,6,0,5,0,0,0,2},
{2,0,0,0,7,0,0,0,4},
{7,0,0,2,9,0,8,5,0}
};*/
private static int[][] chess= {
{5,3,0,0,7,0,0,0,0},
{6,0,0,1,9,5,0,0,0},
{0,9,8,0,0,0,0,6,0},
{8,0,0,0,6,0,0,0,3},
{4,0,0,8,0,3,0,0,1},
{7,0,0,0,2,0,0,0,6},
{0,6,0,0,0,0,2,8,0},
{0,0,0,4,1,9,0,0,5},
{0,0,0,0,8,0,0,7,9}
};
public static void main(String[] args) {
// TODO Auto-generated method stub
while(!pdStatus()) {
for(int i=0;i<9;i++) {
for(int j=0;j<9;j++) {
if(chess[i][j]==0) {//如果这个点上有非0数字则进去填写
calcFillIn(i,j);
}
}
}
}
printFun();
}
//计算与填写
private static void calcFillIn(int row,int col) {
//这里要记录该单位上可被填写的值是那些,所以申明一个A[9]数据;-1表示已未被占用,0表示已被占用
int[] A = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
//剔除当前行上已被占用的数据
for(int i=0;i<9;i++) {
if(i!=col) {//剔除自己
if(chess[row][i]!=0) {
A[chess[row][i]-1] = 0;
}
}
}
//剔除当前列上已被占用的数据
for(int j=0;j<9;j++) {
if(j!=row) {
if(chess[j][col]!=0) {
A[chess[j][col]-1] = 0;
}
}
}
//剔除该单元所在的九宫格非0元素
int m = row/3;
int n = col/3;
for(int i=m*3;i<(m+1)*3;i++) {
for(int j=n*3;j<(n+1)*3;j++) {
if(i!=row&&j!=col) {
if(chess[i][j]!=0) {
A[chess[i][j]-1] = 0;
}
}
}
}
//判断当前位置存在那些可填写数据
int count=0;
for(int i=0;i<9;i++) {
if(A[i]==-1)
count++;
}
if(count==1) {
for(int i=0;i<9;i++) {
if(A[i]==-1)
chess[row][col] = (i+1);
}
}
}
//判断9*9居正是否填写完全
private static boolean pdStatus() {
for(int i=0;i<9;i++) {
for(int j=0;j<9;j++) {
if(chess[i][j]==0)
return false;
}
}
return true;
}
//打印9*9居正
private static void printFun() {
for(int i=0;i<9;i++) {
for(int j=0;j<9;j++) {
System.out.print(chess[i][j]+" ");
}
System.out.println();
}
System.out.println("***********************************");
}
}
注:每一个方法都有详细说明,细看相信你一定能够看懂!