dfs例題,9*9數獨填空問題
阿新 • • 發佈:2022-05-05
package demo2;
import java.awt.print.Printable;
import java.util.Arrays;
import java.util.Scanner;
public class P115 {
//dfs例題,9*9數獨填空問題
//思路:填之前檢查,順利填到最後就列印和結束。否則說明當前填法錯誤,層層回溯、層層清空
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char[][] table = new char[9][];
for (int i = 0; i < 9; i++) {
table[i]=sc.nextLine().toCharArray();
}
dfsShuDu(table,0,0);
}
static void dfsShuDu(char[][] table, int i, int j) { if(i==9) { for(int a=0;a<9;a++) { for(int b=0;b<9;b++) { System.out.print(table[a][b]); } System.out.println(); } System.exit(0); //不能return,return是走不通回溯 } if(table[i][j]=='0') { for(int a=1;a<10;a++) { //看1~9哪些能填 if(check(table,i,j,a)) { table[i][j]=(char)('0'+a); dfsShuDu(table, i+(j+1)/9, (j+1)%9); //dfs table[i][j]='0'; //失敗回溯和清空 } } } else { //到下一格,用整除和取餘應對換行的情況 dfsShuDu(table, i+(j+1)/9, (j+1)%9); } } static boolean check(char[][] table, int i, int j, int a) { char temp=(char)('0'+a); for(int k=0;k<9;k++) { if(table[i][k]==temp) return false; if(table[k][j]==temp) return false; } return true; }
}