• Java实现九阶数独


    你一定听说过“数独”游戏。
    如【图1.png】,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。

    数独的答案都是唯一的,所以,多个解也称为无解。

    本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。

    本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。

    格式要求,输入9行,每行9个字符,0代表未知,其它数字为已知。
    输出9行,每行9个数字表示数独的解。

    例如:
    输入(即图中题目):
    005300000
    800000020
    070010500
    400005300
    010070006
    003200080
    060500009
    004000030
    000009700

    程序应该输出:
    145327698
    839654127
    672918543
    496185372
    218473956
    753296481
    367542819
    984761235
    521839764

    再例如,输入:
    800000000
    003600000
    070090200
    050007000
    000045700
    000100030
    001000068
    008500010
    090000400

    程序应该输出:
    812753649
    943682175
    675491283
    154237896
    369845721
    287169534
    521974368
    438526917
    796318452

    资源约定:
    峰值内存消耗(含虚拟机) < 256M
    CPU消耗 < 2000ms

    请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
    注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
    注意:主类的名字必须是:Main,否则按无效代码处理。
    在这里插入图片描述

    import java.util.Scanner;
    
    public class Main {
        public static int[][] group = new int[9][9];
        public static int[][] value = new int[9][9];
        public static int[][] row = new int[9][9];
        public static int[][] ring = new int[9][9];
        public static int[][] get_group = new int[9][9];
        
        public void init() {
            String[] S = new String[9];
            for(int i = 0;i < 3;i++) {
                S[i] = "000111222";
                S[3 + i] = "333444555";
                S[6 + i] = "666777888";
            }
            for(int i = 0;i < 9;i++)
                for(int j = 0;j < S[i].length();j++)
                    group[i][j] = S[i].charAt(j) - '0';
            for(int i = 0;i < 9;i++)
                for(int j = 0;j < 9;j++) {
                    row[i][j] = -1;
                    ring[i][j] = -1;
                    get_group[i][j] = -1;
                }
        }
        
        public void dfs(int step) {
            if(step == 81) {
                for(int i = 0;i < 9;i++) {
                    for(int j = 0;j < 9;j++)
                        System.out.print(value[i][j]);
                    System.out.println();
                }
                return;
            } else {
                int x = step / 9;
                int y = step % 9;
                if(value[x][y] > 0)
                    dfs(step + 1);
                else {
                    for(int i = 1;i <= 9;i++) {
                        if(row[x][i - 1] == -1 && ring[y][i - 1] == -1 && 
                                 get_group[group[x][y]][i - 1] == -1 && value[x][y] == 0) {
                            value[x][y] = i;
                             row[x][i - 1] = 1;
                            ring[y][i - 1] = 1;
                            get_group[group[x][y]][i - 1] = 1;
                            dfs(step + 1);
                             value[x][y] = 0;
                            row[x][i - 1] = -1;
                             ring[y][i - 1] = -1;
                            get_group[group[x][y]][i - 1] = -1;
                        }
                    }
                }
            }
        }
        
        public static void main(String[] args) {
            Main test = new Main();
            test.init();
            Scanner in = new Scanner(System.in);
            for(int i = 0;i < 9;i++) {
                String s = in.next();
                for(int j = 0;j < s.length();j++) {
                    int t = s.charAt(j) - '0';
                    value[i][j] = t;
                    if(t != 0) {
                        row[i][t - 1] = 1;
                        ring[j][t - 1] = 1;
                        get_group[group[i][j]][t - 1] = 1;
                    }
                }
            }
            test.dfs(0);
        }
    }
    
  • 相关阅读:
    一般工程文件和DLL工程文件区别
    [转载 js]javascript的陷井
    函数两种定义方法的区别
    D2视频补完,哈哈,有我的镜头
    YUI中js的继承示例
    状态模式
    YUI2.x和YUI3的差别
    函数两种定义方法的区别
    YUI中js的继承示例
    D2视频补完,哈哈,有我的镜头
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13078048.html
Copyright © 2020-2023  润新知