N皇后和N皇后2
回溯法:
dfs:從第1行遍歷到第n行。每一行中遍歷所有可能放置的列,利用isUsable判斷是否是可行的皇后位置:如果是當前位置放皇后,繼續dfs,最後需要回溯,將當前位置的皇后去掉。當第n行遍歷結束時,用track轉換為題目的輸出。
isUsable:判斷當前位置能否放置皇后,需要判斷當前列和左上,右上即可。左下和右下,因為沒有放置,判斷沒有意義。
track:將二維int陣列轉換為題目的輸出。
class Solution {
List<List<String>> res=new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
//棋盤,預設為0表示空,1表示皇后
int[][] board=new int[n][n];
//row當前填寫得的行號
dfs(n,0,board);
return res;
}
//深度優先遍歷
private void dfs(int n, int row, int[][] board) {
//0~n-1都填寫完畢
if (row==n){
res.add(track(board,n));
return;
}
for (int col = 0; col < n; col++) {
if (isUsable(board,row,col)){
board[row][col]=1;
//填寫下一行
dfs(n,row+1,board);
board[row][col]=0;//回溯
}
}
}
//board[row][col]是否可用,只需判斷之前的是否滿足就可以
private boolean isUsable(int[][] board, int row, int col) {
//檢查列上有無皇后
for (int i = 0; i < row; i++) {
if (board[i][col]==1)return false;
}
//判斷當前座標的右上角有沒有皇后
for (int i = row - 1, j = col + 1; i >= 0 && j < board.length; i--, j++) {
if (board[i][j] ==1) {
return false;
}
}
//判斷當前座標的左上角有沒有皇后
for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
if (board[i][j] ==1) {
return false;
}
}
return true;
}
//將int型別棋盤轉換成輸出格式
private List<String> track(int[][] board, int n) {
List<String> list=new ArrayList<>();
for (int i = 0; i < n; i++) {
StringBuilder temp=new StringBuilder();
for (int j = 0; j < n; j++) {
if (board[i][j]==0)temp.append('.');
else temp.append('Q');
}
list.add(temp.toString());
}
return list;
}
}
leetcode 53.N皇后2
和1的不同之處在於,1需要輸出完整的結果,2只需要輸出個數。因此2對比1來說,沒有輸出轉換函式,也不需要結果集,只需在第n行遍歷結束時候,計數+1即可。
class Solution {
int count=0;
public int totalNQueens(int n) {
int[][] board=new int[n][n];
dfs(board,0,n);
return count;
}
private void dfs(int[][] board,int row,int n){
if(row==n){
count++;
return;
}
for(int col=0;col<n;col++){
if(isUseable(board,row,col)){
board[row][col]=1;
dfs(board,row+1,n);
board[row][col]=0;
}
}
}
private boolean isUseable(int[][] board,int row,int col){
for(int i=0;i<row;++i){
if(board[i][col]==1)
return false;
}
for(int i=row-1,j=col-1;i>=0&&j>=0;--i,--j){
if(board[i][j]==1)
return false;
}
for(int i=row-1,j=col+1;i>=0&&j<board.length;--i,++j){
if(board[i][j]==1)
return false;
}
return true;
}
}
相關文章
- N 皇后
- 51,N皇后
- N皇后問題
- 7-22 n queens (10分) 八皇后(n皇后)問題
- 20241201: 51. N 皇后
- 藍橋杯-N皇后
- 52. N皇后 II
- LeetCode 52. N皇后 IILeetCode
- 演算法:N皇后二演算法
- HDU - 2553 N皇后問題(DFS)
- Leetcode每日一題:52.N-Queens II(N皇后Ⅱ)LeetCode每日一題
- 2020-11-18 N皇后問題
- N皇后問題(各種優化)優化
- 回溯法(排列樹)解決八(N)皇后問題
- [Hdfs] lc52. N皇后 II(dfs方案數+經典)
- n皇后問題--回溯法,以DFS的方式搜尋
- leetcode演算法題解(Java版)-9-N皇后問題LeetCode演算法Java
- Leetcode 通過率最高的困難題 N皇后 II 【回溯解法-剪枝】LeetCode
- YCOJN皇后
- 每日一題之拉低通過率 回溯演算法 leetcode 51 N皇后每日一題演算法LeetCode
- 【一天一大 lee】N皇后 II (難度:困難) - Day20201017
- python八皇后Python
- 程式碼隨想錄演算法訓練營第三十天 | 51.N 皇后演算法
- 棋盤 K皇后
- 八皇后問題分析和實現
- 八皇后||演算法演算法
- 編寫程式實現 f(n)=f(n-1)+f(n-2) (f(1)=1 和 f(2)=2 )函式。函式
- 洛谷八皇后問題
- 八皇后問題python解法Python
- P1219 八皇后(dfs)
- 2022-07-17:1、2、3...n-1、n、n、n+1、n+2... 在這個序列中,只有一個數字有重複(n)。 這
- P10871 皇后 Kraljice 題解
- 洛谷 P1219 八皇后
- 計算2的N次冪n 可輸入,n為自然數
- Python 八皇后解法(非遞迴版本)Python遞迴
- LeetCode之N-Repeated Element in Size 2N Array(Kotlin)LeetCodeKotlin
- 在openwrt路由中加入n2n,並在ubuntu里加入n2n服務,實現開機聯網互通互訪路由Ubuntu
- 輸入N,再輸入N個數,N