JAVA 实现数独
一、數獨是什么?
數獨是源自18世紀瑞士的一種數學游戲。是一種運用紙、筆進行演算的邏輯游戲。
玩家需要根據9×9盤面上的已知數字,推理出所有剩余空格的數字,并滿足每一行、每一列、每一個粗線宮(3*3)內的數字均含1-9,且不重復。
數獨盤面是個九宮,每一宮又分為九個小格。在這八十一格中給出一定的已知數字和解題條件,利用邏輯和推理,在其他的空格上填入1-9的數字。使1-9每個數字在每一行、每一列和每一宮中都只出現一次,所以又稱“九宮格”。
水平方向有九橫行,垂直方向有九縱列的矩形,畫分八十一個小正方形,稱為九宮格(Grid)。
如圖一所示,是數獨(Sudoku)的作用范圍。
三行與三列相交之處有九格,每一單元稱為小九宮(Box、Block),簡稱宮,如圖四所示
二、JAVA實現數獨思路分析
1、定義一個9*9的二維數組arr,初始值為默認0;
2、使用for循環,給每個格子填數,這個格子中的數必是1-9中的某一個數字。
如果已經到了最后一行最后一格的下一列,則代表已填數完成。
如果已到了最后一列,則進行新的一行的填數,即 行數+1,列數為第1列。
如果二維數組中元素的值為0,則進入for循環,在循環中使用遞歸填數,在此過程中,需要排除行、列、宮中已經存在的數字,在剩下的數字中隨機選一個。
如果排除掉行、列、宮中的數字后,已經沒有可選數字了,說明上一個數填錯了,則使用回溯法,還原前一格的數字為0并重新開始填數,直到生成一個可用的數獨。
3、第2步,要用到當前位置上是否可以放入數字的判斷。
1)當同一列的每一行=要填入的數字時,代表同一列有沖突;
2)當同一行的每一列=要填入的數字時,代表同一行有沖突?;
3)判斷自己所在的宮格內是否有重復數字需要使用for循環
當前格子的行和列分別除以3就代表所在的宮的左上角的行與列。依次循環判斷是否與當前要填入的數相等。
三、代碼實現
public class Sudoku {static int[][] chessNumArr = new int[9][9];public static void main(String[] args) {setNumber(0,0);print();}public static void setNumber(int i,int j){if(i==8 && j==9){ //如果已經到了最后一行最后一格的下一列,則代表已填數完成print();return;}if(j==9){ //如果已到了最后一列,則進行新的一行的填數,即 行數+1,列數為第1列i++;j=0;}if(chessNumArr[i][j] == 0){for(int m=1;m<=9;m++){if(judge(i,j,m)){chessNumArr[i][j]=m;setNumber(i,j+1);chessNumArr[i][j]=0; //如果下一格填1-9所有的數字都沖突,則還原前一格的數字為0}}}else {setNumber(i,j+1);//如果下一格有數字,則將列數+1,即進入下一格}}//判斷當前位置上是否可以放入數字public static boolean judge(int row,int col,int val){for (int i=0;i<9;i++){//判斷同一行,同一列是否有重復數字if(chessNumArr[row][i] == val || chessNumArr[i][col] == val){return false;}}//判斷自己所在的宮格內是否有重復數字int tempRow = row/3;int tempCol = col/3;for(int i=0;i<3;i++){for(int j=0;j<3;j++){if(chessNumArr[tempRow*3+i][tempCol*3+j]==val){return false;}}}return true;}public static void print(){for(int i=0;i<9 ;i++){for(int j=0;j<9;j++){System.out.print(chessNumArr[i][j]+" ");}System.out.println();}System.out.println("------------------------------------------------");} }輸出結果有很多種,這里只列舉一部分:
------------------------------------------------
1 2 3 4 5 6 7 8 9?
4 5 6 7 8 9 1 2 3?
7 8 9 1 2 3 4 5 6?
2 1 4 3 6 5 8 9 7?
3 6 5 9 7 8 2 1 4?
9 7 8 2 1 4 6 3 5?
5 4 7 8 3 1 9 6 2?
8 3 2 6 9 7 5 4 1?
6 9 1 5 4 2 3 7 8?
------------------------------------------------
1 2 3 4 5 6 7 8 9?
4 5 6 7 8 9 1 2 3?
7 8 9 1 2 3 4 5 6?
2 1 4 3 6 5 8 9 7?
3 6 5 9 7 8 2 1 4?
9 7 8 2 1 4 6 3 5?
5 4 7 8 3 2 9 6 1?
6 9 2 5 4 1 3 7 8?
8 3 1 6 9 7 5 4 2?
------------------------------------------------
1 2 3 4 5 6 7 8 9?
4 5 6 7 8 9 1 2 3?
7 8 9 1 2 3 4 5 6?
2 1 4 3 6 5 8 9 7?
3 6 5 9 7 8 2 1 4?
9 7 8 2 1 4 6 3 5?
5 4 7 8 3 2 9 6 1?
8 3 1 6 9 7 5 4 2?
6 9 2 5 4 1 3 7 8?
------------------------------------------------
?
?
總結
- 上一篇: Unity使用Input Sytem实现
- 下一篇: [搜狗招聘] 搜狗搜索引擎 产品专员 欢