数独.java

来源:互联网 发布:我的世界天堂门js 编辑:程序博客网 时间:2024/05/22 16:41
package A类有价值的回顾的;import java.util.Scanner;//真的很难下手//有了一定的套路模型了public class 数独{    public static int[][] a = new int[9][9];    public static boolean fa(int h,int l,int i){//检查要求的区域是否有重复,这里不能简单的通过标记TRUE还是FALSE来完成        //检查同色的九宫格,看题目,少了一种筛选条件,导致大量的分支出现        int up = h%3;        int left = l%3;        for(int m=h-up;m<h-up+3;m++)//注意这种相对位置的求法            for(int n=l-left;n<l-left+3;n++){                if(a[m][n] == i)                    return false;            }        //检查行        for(int j=0;j<9;j++){            if(i == a[h][j])                return false;        }        //检查列        for(int j=0;j<9;j++){            if(i == a[j][l])                return false;           }        return true;    }    public static void f(int b){        //这里只需要传递一个b就可以表示几行几列,这不也就是状态压缩的思想吗        int h = b/9;        int l = b%9;        if(b == 81){            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[h][l] == 0){            //选一个合适的数赋给他            for(int i=1;i<=9;i++){                //检查第h行第l列是否能输入i                if(fa(h,l,i) == true){                a[h][l] = i;                f(b+1);                a[h][l] = 0;                }            }            return;        }        else{//这里就是题目中已经输入的数,不等于0说明已经被填好了            f(b+1);            return;        }    }    public static void main(String[] args){    String[] ss = new String[9];    Scanner sc = new Scanner(System.in);    for(int k=0;k<9;k++){        ss[k] = sc.nextLine();    }    for(int i=0;i<9;i++){        for(int j=0;j<9;j++){            a[i][j] = ss[i].charAt(j)-'0';//借助字符串进行输入,字符串的charAt()可以实现一位输入            }        }    f(0);    }}/*你一定听说过“数独”游戏。如图,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。数独的答案都是唯一的,所以,多个解也称为无解。本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。格式要求,输入9行,每行9个字符,0代表未知,其它数字为已知。输出9行,每行9个数字表示数独的解。例如:输入(即图中题目):005300000800000020070010500400005300010070006003200080060500009004000030000009700程序应该输出:145327698839654127672918543496185372218473956753296481367542819984761235521839764再例如,输入:800000000003600000070090200050007000000045700000100030001000068008500010090000400程序应该输出:812753649943682175675491283154237896369845721287169534521974368438526917796318452资源约定:峰值内存消耗(含虚拟机) < 256MCPU消耗  < 2000ms*/
原创粉丝点击