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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 36有效的数独37解数独(八皇后问题)

發(fā)布時(shí)間:2025/3/20 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 36有效的数独37解数独(八皇后问题) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

公眾號(hào):bigsai 回復(fù)進(jìn)群加入打卡

有效的數(shù)獨(dú)

判斷一個(gè) 9x9 的數(shù)獨(dú)是否有效。只需要根據(jù)以下規(guī)則,驗(yàn)證已經(jīng)填入的數(shù)字是否有效即可。

數(shù)字 1-9 在每一行只能出現(xiàn)一次。
數(shù)字 1-9 在每一列只能出現(xiàn)一次。
數(shù)字 1-9 在每一個(gè)以粗實(shí)線分隔的 3x3 宮內(nèi)只能出現(xiàn)一次。

上圖是一個(gè)部分填充的有效的數(shù)獨(dú)。

數(shù)獨(dú)部分空格內(nèi)已填入了數(shù)字,空白格用 ‘.’ 表示。

示例 1:

輸入: [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"] ] 輸出: true

示例 2:

輸入: [["8","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"] ] 輸出: false

解釋:

除了第一行的第一個(gè)數(shù)字從 5 改為 8 以外,空格內(nèi)其他數(shù)字均與 示例1 相同。
但由于位于左上角的 3x3 宮內(nèi)有兩個(gè) 8 存在, 因此這個(gè)數(shù)獨(dú)是無(wú)效的。

說(shuō)明:

一個(gè)有效的數(shù)獨(dú)(部分已被填充)不一定是可解的。
只需要根據(jù)以上規(guī)則,驗(yàn)證已經(jīng)填入的數(shù)字是否有效即可。
給定數(shù)獨(dú)序列只包含數(shù)字 1-9 和字符 ‘.’ 。
給定數(shù)獨(dú)永遠(yuǎn)是 9x9 形式的。

分析
本題的話就是要選擇合理的方式去判斷是否有效。是否有效需要滿足三個(gè)維度:

  • 行是否有效
  • 列是否有效
  • 3x3的格子內(nèi)是否有效。

而每一個(gè)維度考慮的問(wèn)題都是有相關(guān)性的,例如這一行的1-9每個(gè)數(shù)字只能出現(xiàn)一次,這一列也是,這個(gè)3x3也是。這樣的話我們就可以通過(guò)三個(gè)boolean數(shù)組來(lái)判斷各自對(duì)應(yīng)的區(qū)間是否滿足。因?yàn)槊總€(gè)區(qū)間每個(gè)數(shù)字最多只能出現(xiàn)一次,所以判斷所有次數(shù)滿足條件即可,一旦不滿足就停止返回false。

當(dāng)然這個(gè)有點(diǎn)麻煩的就是需要求當(dāng)前是在第幾個(gè)3x3的小方格內(nèi),經(jīng)過(guò)思考(i/3)*3+j/3這個(gè)表達(dá)式可以很好的表示。

實(shí)現(xiàn)代碼為:

public boolean isValidSudoku(char[][] board) {boolean hang[][]=new boolean[9][9];//第一個(gè)是 9個(gè)坑,第二個(gè)是數(shù)字位置boolean lie[][]=new boolean[9][9];boolean fangge[][]=new boolean[9][9];for(int i=0;i<board.length;i++){for(int j=0;j<board[0].length;j++){if(board[i][j]=='.') {continue;}int num=board[i][j]-'1';if(hang[i][num]||lie[j][num]||fangge[(i/3)*3+j/3][num]){return false;}else {hang[i][num]=true;lie[j][num]=true;fangge[(i/3)*3+j/3][num]=true;}}}return true;}

解數(shù)獨(dú)

題目描述:

編寫(xiě)一個(gè)程序,通過(guò)填充空格來(lái)解決數(shù)獨(dú)問(wèn)題。

一個(gè)數(shù)獨(dú)的解法需遵循如下規(guī)則:

數(shù)字 1-9 在每一行只能出現(xiàn)一次。
數(shù)字 1-9 在每一列只能出現(xiàn)一次。
數(shù)字 1-9 在每一個(gè)以粗實(shí)線分隔的 3x3 宮內(nèi)只能出現(xiàn)一次。
空白格用 ‘.’ 表示。


一個(gè)數(shù)獨(dú)。

答案被標(biāo)成紅色。

提示:

給定的數(shù)獨(dú)序列只包含數(shù)字 1-9 和字符 ‘.’ 。
你可以假設(shè)給定的數(shù)獨(dú)只有唯一解。
給定數(shù)獨(dú)永遠(yuǎn)是 9x9 形式的。

分析
此題相比上一題難度稍微大一些,是一個(gè)八皇后問(wèn)題的變種,對(duì)于上一題我想我們已經(jīng)知道怎么判斷這個(gè)是否滿足規(guī)則——使用三個(gè)boolean數(shù)組判斷。

但是,這一題有難度的就是需要我們手動(dòng)放數(shù)據(jù)進(jìn)去,手動(dòng)去試探,并且每一步放置之后對(duì)后面都有影響。我們?cè)撊绾嗡伎歼@種問(wèn)題呢?

dfs回溯,八皇后問(wèn)題其實(shí)就是典型的回溯過(guò)程,而這種二維的回溯需要考慮一些問(wèn)題,我們對(duì)于每一行每一行考慮。 每一行已經(jīng)預(yù)有一些數(shù)據(jù)事先標(biāo)記,在從開(kāi)始試探放值,滿足條件后向下遞歸試探。一直到結(jié)束如果都滿足那么就可以結(jié)束返回?cái)?shù)組值。

對(duì)于八皇后問(wèn)題后面還會(huì)出一篇細(xì)講,這里的話有兩點(diǎn)需要注意的在這里提一下:

  • 用二維兩個(gè)參數(shù)進(jìn)行遞歸回溯判斷起來(lái)誰(shuí)加誰(shuí)減比較麻煩,所以我們用一個(gè)參數(shù)index用它來(lái)計(jì)算橫縱坐標(biāo)進(jìn)行轉(zhuǎn)換,這樣就減少二維遞歸的一些麻煩。
  • 回溯是一個(gè)來(lái)回的過(guò)程,在回來(lái)的過(guò)程正常情況需要將數(shù)據(jù)改回去,但是如果已經(jīng)知道結(jié)果就沒(méi)必要再該回去可以直接停止放置回溯造成值的修改(這里我用了一個(gè)isfinish的boolean類(lèi)型進(jìn)行判斷)。

具體ac代碼為:

boolean isfinish=false; boolean hang[][]=new boolean[9][10];//第一個(gè)是 9個(gè)坑,第二個(gè)是數(shù)字位置 boolean lie[][]=new boolean[9][10]; boolean fangge[][]=new boolean[9][10]; public void solveSudoku(char[][] board) {//首先遍歷一遍 將已有元素的行列信息提前做處理for(int i=0;i<board.length;i++){for(int j=0;j<board[0].length;j++){if(board[i][j]=='.') {continue;}int k=board[i][j]-'0'; hang[i][k]=true;lie[j][k]=true;fangge[(i/3)*3+j/3][k]=true;}} dfs(0,board); } private void dfs( int index, char[][] board) {if(isfinish) return;//已有結(jié)果不需要再計(jì)算if(index==81) {//到達(dá)最后一個(gè)前面都滿足條件說(shuō)明可以停止了isfinish=true;return;}int i=index/9;//行int j=index%9;//列if(board[i][j]!='.')//已經(jīng)有數(shù)字{dfs( index+1, board);}else {//此處需要補(bǔ)充數(shù)字for(int k=1;k<10;k++){ //如果不滿足直接跳過(guò)if(hang[i][k]||lie[j][k]||fangge[(i/3)*3+j/3][k]) {continue;}//滿足臨時(shí)試探修改 進(jìn)行回溯board[i][j]=(char) (k+'0'); hang[i][k]=true;lie[j][k]=true;fangge[(i/3)*3+j/3][k]=true;//遞歸回溯dfs( index+1, board);//遞歸完成后需要復(fù)原,如果結(jié)束了不需要復(fù)原直接停止if(isfinish)return;board[i][j]='.'; hang[i][k]=false;lie[j][k]=false;fangge[(i/3)*3+j/3][k]=false;}} }

結(jié)語(yǔ)

好啦,本次打卡結(jié)束,對(duì)于八皇后問(wèn)題是一個(gè)經(jīng)典的回溯遞歸問(wèn)題,不久就會(huì)出一篇相關(guān)內(nèi)容問(wèn)題的具體分析,敬請(qǐng)來(lái)公眾號(hào)bigsai分享。如果想加入打卡還請(qǐng)加筆者公眾號(hào)bigsai 回復(fù)進(jìn)群。一起打卡,回復(fù)bigsai獲取5G的pdf學(xué)習(xí)資源。

別忘了下方一鍵三聯(lián)哦!

總結(jié)

以上是生活随笔為你收集整理的LeetCode 36有效的数独37解数独(八皇后问题)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。