1. 程式人生 > >數獨.java

數獨.java

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個數字表示數獨的解。 例如: 輸入(即圖中題目): 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 */