【代碼隨想錄】算法訓練計劃30

【代碼隨想錄】算法訓練計劃30

1、51. N 皇后

按照國際象棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。

n 皇后問題 研究的是如何將 n 個皇后放置在 n×n 的棋盤上,并且使皇后彼此之間不能相互攻擊。

給你一個整數 n ,返回所有不同的 n 皇后問題 的解決方案。

每一種解法包含一個不同的 n 皇后問題 的棋子放置方案,該方案中 ‘Q’ 和 ‘.’ 分別代表了皇后和空位。

我寫的:

我先想了一個思路,然后去看代碼回想錄,和我想的一樣,我取巧了,直接看了她的寫的,不過都理解
但也有一點別的收獲
他把res設為了全局變量,這樣就連&和*都不需要了

收獲:

全局的聲明:var res [][]string

函數內初始化:res = [][]string{}

這樣就不需要取值操作了——就是&,* 這些個

func solveNQueens(n int) [][]string {res := make([][]string, 0)board := make([][]string, n)//下邊就是把數組空的位置都初始化為".",代表空for i := 0; i < n; i++ {board[i] = make([]string, n)}for i := 0; i < n; i++{for j := 0; j < n; j++ {board[i][j] = "."}}backtrack(board, 0, &res)return res
}
func backtrack(board [][]string, row int, res *[][]string) {size := len(board)//結束條件是到board,就是到最后一行也添加皇后了if row == size {ans := make([]string, size)for i := 0; i < size; i++ {ans[i] = strings.Join(board[i], "")}*res = append(*res, ans)return}for col := 0; col < size; col++ {if !isValid(board, row, col){continue}board[row][col] = "Q"backtrack(board, row+1, res)board[row][col] = "."}
}
func isValid(board [][]string, row,col int) (res bool){n := len(board)//判斷這一列上下行是否有Qfor i := 0; i < row; i++ {if board[i][col] == "Q" {return false}}//判斷這一行左右列是否有Qfor i := 0; i < col; i++ {if board[row][i] == "Q" {return false}}//為什么不判斷左下線和右下線的原因很簡單,因為下邊的行還沒有給皇后,所以不需要判斷//判斷左上線是否有Qfor i, j := row, col; i >= 0 && j >= 0; i, j =  i-1, j-1 {if board[i][j] == "Q" {return false}}//判斷右上線是否有Qfor i, j := row, col; i >= 0 && j < n; i,j = i-1,j+1 {if board[i][j] == "Q" {return false}}return true
}
2、37. 解數獨

編寫一個程序,通過填充空格來解決數獨問題。

數獨的解法需 遵循如下規則:

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

提示:

board.length == 9
board[i].length == 9
board[i][j] 是一位數字或者 ‘.’
題目數據 保證 輸入數獨僅有一個解

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

我第一次只能寫到如下這么多了

//做一個二維的字典或者數組,方便第三個判斷,0-02,1-35,2-68或者0-13,1-46,2-79,
jgg := [3][2]{{0,2},{3,5},{6,8},
}
func solveSudoku(board [][]byte)  {list := make([]int, 0)backtrack(list []int, &board)return board
}
func backtrack(board *[][]byte) {//到第九行結束,一行一行的填入,每一行要填入9個數字//記住,這個數獨只有唯一一個解if Index == 9 {ans := make([]int, len(list))copy(ans, list)*board}for i := 0; i <= 9; i++ {//我的難點就是不知道怎么去知道這個行,列,然后去嗯...給他整上數字}
}//判斷所填入數字是否滿足條件
func mz(board *[][]byte, shu,row,col int) bool{//左右這個數沒出現過,i不變,j變,情況下,可以添加這個數字for j := 0; j < 9 ; j++ {if board[row][j] == shu {return false}}//上下這個數沒出現過, i變,j不變for i := 0; i < 9; i++ {if board[i][col] == shu {return false}}//判斷他所在區域的9個格子是否出現-除以三-判斷是第幾個格子h := row/3l := col/3for i := jgg[h][0]; i <= jgg[h][1] {for j := jgg[l][0]; j <= jgg[l][1]{if board[i][j] == shu {return false}}}return true
}

看題解理解后如下啊:

思路:

  1. 第一步咱們很清楚的知道,需要判斷加入的數是否滿足條件,所以寫了mz函數,感覺我判斷格子的方法有點臃腫了
  2. 好,開始正題,進入backtrack
  3. 為什么這次沒有和solveSudoku分開單獨寫一個呢,在于這個題目人家不要返回值,而且填寫的是board,二維的,咱要是在分開的backtrack函數用*[][]int,其實,傳不進去單個值,所以直接在solveSudoku函數先聲明,再初始化,再使用
    4.好了開始說說初始化,也就是backtrack的主體,首先是這個雙重for循環,記得水仙花數,打印圖形嗎,這類的題目就是用了雙重for循環來代表要添加的元素所在的行列
  4. 接著判斷不是’.'的不需要變成數字,跳過當前循環,進入下一層
  5. 重重點開始
  6. 首先是’1’-'9’是選擇列表,但是因為board是[][]byte類型,在你追加的時候需要類型轉換byte(shu),判斷是否滿足mz的傳參也需要
  7. 接著是循環,不過這里用了if,多了一層判斷,為真就return true
  8. 接著回溯,都知道
  9. 接著下邊又有兩個return,說實話,我還不太理解這三個return到底有什么妙用
  10. 關于方格的判斷條件啊,還是人家代碼隨想錄寫得好,值得看看,不過別擔心,不難理解
func solveSudoku(board [][]byte)  {var backtrack func(board [][]byte) boolbacktrack = func(board [][]byte) bool {//雙重for循環,代表行列for  i := 0; i < 9; i++ {for j := 0; j < 9; j++ {//只有當前位置為.的時候才可以添加數字,否則跳過這個數if board[i][j] != '.'{continue}//重點,填寫1-9是選擇列表,for shu := '1'; shu <= '9'; shu++ {if mz(board,byte(shu),i,j) == true {//追加board[i][j] = byte(shu)//循環if backtrack(board) == true {return true}//回溯board[i][j] = '.'}}return false}}return true}backtrack(board)
}
func backtrack(board *[][]byte) {}//判斷所填入數字是否滿足條件
func mz(board [][]byte, shu byte, row,col int) bool {//做一個二維的字典或者數組,方便第三個判斷,0-02,1-35,2-68或者0-13,1-46,2-79,jgg := [3][2]int{{0,2},{3,5},{6,8},}//左右這個數沒出現過,i不變,j變,情況下,可以添加這個數字for j := 0; j < 9 ; j++ {if board[row][j] == shu {return false}}//上下這個數沒出現過, i變,j不變for i := 0; i < 9; i++ {if board[i][col] == shu {return false}}//判斷他所在區域的9個格子是否出現-除以三-判斷是第幾個格子h := row/3l := col/3for i := jgg[h][0]; i <= jgg[h][1]; i++ {for j := jgg[l][0]; j <= jgg[l][1]; j++{if board[i][j] == shu {return false}}}return true
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/160771.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160771.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160771.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微信API:探究Android平臺下Hook技術的比較與應用場景分析

微信API&#xff1a;探究Android平臺下Hook技術的比較與應用場景分析 正文&#xff1a; 在Android平臺開發中&#xff0c;Hook技術是一種常用的技術手段&#xff0c;用于在運行時修改應用程序的行為。下面對一些常見的Hook技術進行比較&#xff0c;并分析它們的適用場景和優缺…

信息系統項目管理師論文

軟考官網&#xff1a;中國計算機技術職業資格網 (ruankao.org.cn) 2020年 2020年下半年試題一&#xff1a;論信息系統項目的成本管理 2019年 2019年下半年試題一&#xff1a;論信息系統項目的整體管理 2019年下半年試題二&#xff1a;論信息系統項目的溝通管理

PCI5565反射內存網技術的應用研究

隨著嵌入式與通信技術的發展&#xff0c;數控系統經歷了由傳統的單處理器的集中式體系結構到開放式體系結構&#xff0c;再到多處理器的分布式數控系統體系結構的發展過程。分布式數控系統以高精、高速的加工特征為發展核心&#xff0c;同時以達到異構網絡間信息的無縫融合&…

分布式鎖3: zk實現分布式鎖

一 zk 實現分布式鎖 1.1 zk分布式操作命令 1.指令&#xff1a; ls / get /zookeeper create /aa "test" delete /aa set /aa "test1" 2..znode節點類型&#xff1a; 永久節點&#xff1a;create /pa…

優秀智慧園區案例 - 上海世博文化公園智慧園區,先進智慧園區建設方案經驗

一、項目背景 世博文化公園是上海的綠色新地標&#xff0c;是生態自然永續、文化融合創新、市民歡聚共享的大公園。作為世博地區的城市更新項目&#xff0c;世博文化公園的建設關乎上海城市風貌、上海文化展示、城市生態環境、市民游客體驗、上海服務品牌等&#xff0c;被賦予…

依托數據、平臺、知識增強等優勢 夸克大模型大幅降低問答幻覺率

“大模型時代&#xff0c;夸克有巨大機會創造出革新性搜索產品。”11月22日&#xff0c;夸克大模型公布了其面向搜索、生產力工具和資產管理助手的大模型技術布局。數據顯示&#xff0c;夸克千億級參數大模型登頂C-Eval和CMMLU兩大權威榜單&#xff0c;夸克百億級參數大模型同樣…

電大搜題——讓學習變得輕松高效

作為一名現代學者&#xff0c;您一定時刻關注著教育領域的進展和創新。今天&#xff0c;我將向大家介紹一個名為“電大搜題”的神奇工具&#xff0c;它將為您的學習之路帶來一場完美的革命。 在快節奏的現代社會中&#xff0c;學習已經成為每個人追求成功的必經之路。然而&…

【數據結構】動態順序表詳解

目錄 1.順序表的概念及結構 2.動態順序表的實現 2.1創建新項目 2.2動態順序表的創建 2.3接口的實現及測其功能 2.3.1初始化 2.3.2尾插 2.3.3頭插 2.3.4尾刪&頭刪 2.3.5打印&從任意位置插入 2.3.6刪除任意位置的數據 2.3.7查找 2.3.8銷毀順序表 3.結語 He…

【交易誤區】初學者常犯的MT4外匯交易錯誤有哪些?

作為初學者&#xff0c;踏入外匯交易市場時&#xff0c;往往會陷入一些常見的誤區&#xff0c;導致交易效果不佳甚至遭受損失。在本文中&#xff0c;我將列舉并解釋五個初學者常見的MT4外匯交易錯誤&#xff0c;并提供相應的解決方案&#xff0c;幫助您避免這些錯誤&#xff0c…

java項目之社區互助平臺(ssm+vue)

項目簡介 社區互助平臺實現了以下功能&#xff1a; 1、一般用戶的功能及權限 所謂一般用戶就是指還沒有注冊的過客,他們可以瀏覽主頁面上的信息。但如果有中意的社區互助信息時&#xff0c;要登錄注冊&#xff0c;只有注冊成功才有的權限。2、管理員的功能及權限 用戶信息的添…

react大文件上傳

目錄 大文件上傳優點&#xff1a; 大文件上傳缺點: 大文件上傳原理&#xff1a; 為什么要用md5 實現流程&#xff1a; 部分代碼1&#xff1a; 部分代碼2&#xff1a;? 大文件上傳優點&#xff1a; 文件太大分片上傳能加快上傳速度,提高用戶體驗能斷點續傳 如果上次上傳失敗…

簡單工程模式

代碼實現 //simpleFactory.h #ifndef _SimpleFactory_H_ #define _SimpleFactory_H_#include <iostream> #include <exception> #include <string>using namespace std;class Operation { protected:double _numberA 0;double _numberB 0; public:Operat…

udp通信socket關閉后,緩存不清空

udp通信socket關閉后&#xff0c;緩存不清空 udp通信socket關閉后&#xff0c;緩存不清空如何清空udp緩存 udp通信socket關閉后&#xff0c;緩存不清空 關閉一個 UDP socket 連接后&#xff0c;底層接收緩沖區中存儲的數據不會被清空。實際上&#xff0c;關閉 socket 連接并不…

MybatisX插件使用

Mybatis X插件 MybatisX 是一款基于 IDEA 的快速開發插件&#xff0c;為效率而生。MybatisX官網&#xff1a;https://baomidou.com/pages/ba5b24/#%E5%8A%9F%E8%83%BD安裝方法&#xff1a;打開 IDEA&#xff0c;進入 File -> Settings -> Plugins&#xff0c;輸入 mybat…

三維控件中定位一個點_vtkPointWidget

開發環境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example參考代碼 demo解決問題&#xff1a;允許用戶使用三維光標在三維空間中定位一個點。關鍵類vtkPointWidget , 光標具有輪廓邊界框、軸對齊十字準線和軸陰影&#xff…

AD7021C 觸摸感應加燈光調節芯片IC 可用于觸摸臺燈、觸摸玩具燈等

AD7021C觸摸感應 IC 是為實現人體觸摸界面而設計的集成電路。可替代機械式輕觸按鍵&#xff0c;實現防水防塵、密封隔離、堅固美觀的操作界面。使用該芯片可以實現 LED 燈光亮度調節&#xff0c;方案所需的外圍電路簡單&#xff0c;操作方便。確定好靈敏度選擇電容&#xff…

【華為OD題庫-033】經典屏保-java

題目 DVD機在視頻輸出時&#xff0c;為了保護電視顯像管&#xff0c;在待機狀態會顯示"屏保動畫”&#xff0c;如下圖所示,DVD Logo在屏幕內來回運動&#xff0c;碰到邊緣會反彈:請根據如下要求&#xff0c;實現屏保Logo坐標的計算算法 1、屏幕是一個800 * 600像素的矩形&…

Vue3 provide 和 inject 實現祖組件和后代組件通信

provide 和 inject 能夠實現祖組件和其任意的后代組件之間通信&#xff1a; 一、provide 提供數據 我們在祖組件中使用provide 將數據提供出去。 使用provide 之前需要先進行引入&#xff1a; import { provide } from "vue"; 語法格式如下&#xff1a; provide(&q…

objectarx + libcurl下載文件遇到的問題

下載失敗導致cad崩潰,報錯’Error handler re-entered.Exiting now ,原因是因為我將libcurl相關的功能繼承到一個類中,在類中進行相關的webapi交互,但是由于最開始進行了請求所以沒有將curl進行初始化導致的傳遞數據錯誤.只需要在函數開始時進行初始化即可. curl curl_easy_i…

山西電力市場日前價格預測【2023-11-23】

日前價格預測 預測說明&#xff1a; 如上圖所示&#xff0c;預測明日&#xff08;2023-11-23&#xff09;山西電力市場全天平均日前電價為148.77元/MWh。其中&#xff0c;最高日前電價為420.40元/MWh&#xff0c;預計出現在18:00。最低日前電價為0.00元/MWh&#xff0c;預計出…