《经典算法》数独问题

题目:

数独问题: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(“***********************************”);
    }
}
《《经典算法》数独问题》《《经典算法》数独问题》                           《《经典算法》数独问题》《《经典算法》数独问题》

注:每一个方法都有详细说明,细看相信你一定能够看懂!

    原文作者:九宫格问题
    原文地址: https://blog.csdn.net/wyj823508/article/details/82020168
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞