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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LeetCode—37. 解数独(困难)

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode—37. 解数独(困难) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

37. 解數獨(困難)

題目描述:
編寫一個程序,通過填充空格來解決數獨問題。
數獨的解法需 遵循如下規則:

數字 1-9 在每一行只能出現一次。
數字 1-9 在每一列只能出現一次。
數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。(請參考示例圖)
數獨部分空格內已填入了數字,空白格用 ‘.’ 表示。

考察重點:遞歸回溯(DFS)

方法概括:通過36中的判別方法,構建row,column,tube進行合法性判定,結合深度優先搜索對矩陣中的 ‘.’ 點位遍歷所有可能填入數字。

public boolean Dfs(int i, int j, char[][] board, boolean[][] row, boolean[][] column, boolean[][] tube){ //后三個參數分別用來判斷,當前位置(i,j)填入一數字后是否合法int p = i / 3 * 3 + j / 3;for(int a1 = 0;a1 < 9 ;a1 ++){ //遍歷1-9,即該位置可以填入的所有數字if(!row[i][a1] && !column[j][a1] && !tube[p][a1]){//判斷該位置填入相應數字后,是否負責數獨規則row[i][a1] = true;column[j][a1] = true;tube[i / 3 * 3 + j / 3][a1] = true;board[i][j] = (char)(a1 + 1 + '0');int tj = j + 1;if (i == 8 && j == 8)return true;for(int ti = i;ti < 9;ti ++) { //當前位置填入a1+1后,繼續尋找并迭代下一個'.'位置for (; tj < 9; tj++) {if (board[ti][tj] == '.') {if (Dfs(ti, tj, board, row, column, tube))return true;ti = 10;break;}if (ti == 8 && tj == 8) //兩處if (ti == 8 && tj == 8)分別用來做遞歸停止條件,即分別為board[8][8]是'.'和數字的情況return true;}tj = 0; //因為遍歷是從(i,j)開始找下一個,所以此處tj=0是配合循環實現矩陣遍歷}row[i][a1] = false; //填入a1無法滿足后續位置滿足條件,則向前回溯column[j][a1] = false;tube[i / 3 * 3 + j / 3][a1] = false;board[i][j] = '.';}}return false;} public void solveSudoku(char[][] board) {boolean[][] row = new boolean[9][9]; // 9個長度為9的判別串。分別用來判斷(i,j)上可以存放的數字,row[i][a1]=true 表示第i行已經存在a1boolean[][] column = new boolean[9][9]; //column[j][a1]=true 表示第j列已經存在a1boolean[][] tube = new boolean[9][9];//tube[i / 3 * 3 + j / 3][a1]=true 表示第i / 3 * 3 + j / 3個正方形內已經存在a1for(int i = 0;i < board.length;i ++)for(int j = 0;j < board[0].length;j ++){ //由于已經擁有一些數字,所以進行初始化if(board[i][j] != '.'){int a1 = board[i][j] - '0' - 1;row[i][a1] = true;column[j][a1] = true;tube[i / 3 * 3 + j / 3][a1] = true;}}for(int i = 0;i < board.length;i ++) //尋找迭代起始位置,即第一個'.'for(int j = 0;j < board[0].length;j ++)if(board[i][j] == '.')Dfs(i, j, board, row, column, tube); }

總結

以上是生活随笔為你收集整理的LeetCode—37. 解数独(困难)的全部內容,希望文章能夠幫你解決所遇到的問題。

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