蓝桥杯 数独

问题描述

你一定听说过“数独”游戏。

如【图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

 

再例如,输入:

8 0 0 0 0 0 0 0 0

0 0 3 6 0 0 0 0 0

0 7 0 0 9 0 2 0 0

0 5 0 0 0 7 0 0 0

0 0 0 0 4 5 7 0 0

0 0 0 1 0 0 0 3 0

0 0 1 0 0 0 0 6 8

0 0 8 5 0 0 0 1 0

0 9 0 0 0 0 4 0 0

 

程序应该输出:

812753649

943682175

675491283

154237896

369845721

287169534

521974368

438526917

796318452

资源约定:

峰值内存消耗(含虚拟机) < 256M

CPU消耗  < 2000ms

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

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。

注意:主类的名字必须是:Main,否则按无效代码处理。


分析题意:这题用dfs进行二维搜索,第一行搜完继续下一行搜索,注意要让每一行,每一列 ,以及所在区域块的,1到9只出现一次

代码实现

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    private static int a[][];
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        a = new int[9][9];
        for (int i = 0; i < 9; i++) {
            String s[] = reader.readLine().split(" ");
            for (int j = 0; j < 9; j++) {
                if (!s[j].equals("*")) {
                    a[i][j]  = Integer.parseInt(s[j]);
                }
            }
        }
        dfs(0,0);
    }
    //检查坐标(x,y)可不可以填value值
    private static boolean judeg(int x,int y,int value) {
        //检查行和列
        for (int i = 0; i <9; i++) {
            if (a[i][y]==value||a[x][i]==value) {
                return false;
            }
        }
        //检查九宫格
        int startX = (x/3)*3,endX = startX+3;
        int startY = (y/3)*3,endY = startY+3;
        for (int i = startX; i < endX; i++) {
            for (int j = startY; j < endY; j++) {
                if (a[i][j]==value) {
                    return false;
                }
            }
        }
        return true;
    }
    private static void dfs(int x, int y) {
        if (x==9) {
            for (int i = 0; i < 9; i++) {
                for (int j = 0; j < 9; j++) {
                    System.out.print(a[i][j]);
                }
                System.out.println();
            }
            System.out.println("");
            return;
        }
        if (a[x][y]==0) {
            for (int i = 1; i <=9; i++) {
                if (judeg(x, y, i)) {
                    //填数
                    a[x][y] = i;
                    dfs(x+y/8, (y+1)%9);
                    //回溯
                    a[x][y] = 0;
                }
            }
        }else {
            dfs(x+y/8, (y+1)%9);
        }
    }
}
posted @ 2018-03-30 16:11  xuewenのblog  阅读(395)  评论(0编辑  收藏  举报