日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA 实现数独

發布時間:2024/1/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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?
------------------------------------------------

?

?

總結

以上是生活随笔為你收集整理的JAVA 实现数独的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。