n皇后問題--回溯法,以DFS的方式搜尋
所謂一山不能容二虎,在 n×n 的棋盤上放置彼此不受攻擊的 n 個皇后。按照國際象棋的規則,皇后可以攻擊與
之在同一行、同一列、同一斜線上的棋子。設計演算法在 n×n 的棋盤上放置 n 個皇后,使其彼此不受攻擊。
輸入:
4
輸出:
2 4 1 3
3 1 4 2
可行方案數:2
問題分析:
題目要求不同行不同列不同斜線上,因為約束條件太多和考慮複雜度,我們不可能直接每個都列舉,可以先以行為主導,每行只放一個,找到可行的位置後就進行下一行的搜尋,當某個位置放第t個皇后時,需要判斷與前面已經放好的t-1個皇后的列和對角線時候相同,都不相同就可以在該位置放t皇后,判斷是否在同一對角線可以用兩位置行的差的絕對值和列的差的絕對值是否相等,可以以深度優先搜尋的方式進行搜尋,在t行的第i列判斷時候可以放,可以放就向深一行進行搜尋,不可以放就繼續判斷i+1,因為是n行n列的棋盤有n個皇后,說明每一行每一列都已經有一個且只有一個皇后,如果在第t行全部搜素都沒有可行的位置說明下面幾行繼續放也沒意義,這時就需要回溯,返回上一行繼續搜尋,直到n個皇后放完,當一種方案確定後也需要回溯繼續搜尋時候還有另外放方案。
程式碼:
#include<iostream>
#include<math.h>
using namespace std;
#define M 105
int n;//皇后
int x[M];//第M個皇后放在M行X[M]列
int num;//可行方案的個數
bool place(int t)
{//判斷第t個皇后是否能放在第i列
bool ok = true;
for (int i = 1; i < t; i++)//判斷i列是否與前t-1個皇后的位置衝突
{
if (x[i] == x[t] || (t - i) == fabs(x[t] - x[i]))//因為已經是以行為主導,所以判斷是隻需要判斷列和對角線
{
ok = false;
break;
}
}
return ok;
}
void Backtrack(int t)
{
if (t > n)//如果當前位置為n,則說明已經得到一個方案
{
num++;
for (int i = 1; i <= n; i++)//列印路徑
cout << x[i] << " ";
cout << endl;
}
else
for (int i = 1; i <= n; i++)
{
x[t] = i;//第t行第x[t]列,也是此時的第i列
if (place(t))
Backtrack(t + 1);//如果不衝突。則進行下一行的搜尋
}
}
int main()
{
cin >> n;
num = 0;
Backtrack(1);
cout << "可行方案數:" << num << endl;
return 0;
}
相關文章
- HDU - 2553 N皇后問題(DFS)
- 回溯法(排列樹)解決八(N)皇后問題
- N皇后問題
- 數獨問題(DFS+回溯)
- 7-22 n queens (10分) 八皇后(n皇后)問題
- 遞迴——深度優先搜尋(DFS)——以滑雪問題為例(自頂而下)遞迴
- Leetcode 通過率最高的困難題 N皇后 II 【回溯解法-剪枝】LeetCode
- 從八皇后問題到回溯演算法演算法
- 2020-11-18 N皇后問題
- N皇后問題(各種優化)優化
- N皇后和N皇后2
- [Hdfs] lc52. N皇后 II(dfs方案數+經典)
- 3. 工作分配問題(回溯法)設有n件工作分配給n個人。。。
- dfs深度優先搜尋解決迷宮類問題(遍歷)
- DFS(深度優先搜尋)
- 每日一題之拉低通過率 回溯演算法 leetcode 51 N皇后每日一題演算法LeetCode
- 回溯法求迷宮問題
- N 皇后
- leetcode演算法題解(Java版)-9-N皇后問題LeetCode演算法Java
- 51,N皇后
- 單詞搜尋問題
- Leetcode每日一題:52.N-Queens II(N皇后Ⅱ)LeetCode每日一題
- 關於搜尋地址的問題
- P1219 八皇后(dfs)
- 回溯演算法 | 追憶那些年曾難倒我們的八皇后問題演算法
- 【力扣】排列問題(回溯法)(去重)力扣
- 解決 PbootCMS 搜尋未搜尋到任何資料的問題boot
- 【演算法】深度優先搜尋(DFS)演算法
- DFS與BFS——理解簡單搜尋(中文虛擬碼+例題)
- 回溯問題
- 【Leetcode 346/700】79. 單詞搜尋 【中等】【回溯深度搜尋JavaScript版】LeetCodeJavaScript
- SAP Fiori應用的搜尋問題
- 第七章 遞迴、DFS、剪枝、回溯等問題 ------------- 7.3 題解:機器人走方格問題遞迴機器人
- 回溯法解決全排列問題總結
- 網路卡-熱點搜尋不到或者無法連線問題
- 資料結構和演算法——遞迴-八皇后問題(回溯演算法)資料結構演算法遞迴
- GitHub的高階搜尋方式Github
- Linux vim 搜尋文字的方式Linux