HDU - 2553 N皇后問題(DFS)
Description
在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。
你的任務是,對於給定的N,求出有多少種合法的放置方法。
Input
共有若干行,每行一個正整數N≤10,表示棋盤和皇后的數量;如果N=0,表示結束。
Output
共有若干行,每行一個正整數,表示對應輸入行的皇后的不同放置數量。
Sample Input
1
8
5
0
Sample Output
1
92
10
Solution
判斷對角線時候:
- 在 (↖)方向上
列-行
的差是相等的,假如我們用陣列儲存負數肯定是不行的, 所以我們要加上 n,讓他變為非負。 - (↗)方向上的資料的行和列的特點是 在 (↗)方向上
列+行
的和是相等的。
參考https://www.cnblogs.com/chenchengxun/p/3759278.html
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int vis[3][50], P[15]; //三個方向 ↖↑↗在此三個方向都不能有皇后
int n, sum;
void DFS(int row)
{
int i;
if (row == n + 1) //遞迴結束
{
sum++;
return;
}
for (i = 1; i <= n; i++)
{
// 在列、左對角線、右對角線剪枝
if (vis[0][row - i + n] == 0 && vis[1][i] == 0 && vis[2][row + i] == 0)
{
vis[0][row - i + n] = vis[1][i] = vis[2][row + i] = 1; //變值
DFS(row + 1); //深搜
vis[0][row - i + n] = vis[1][i] = vis[2][row + i] = 0; //回溯
}
}
}
int main()
{
for (n = 1; n <= 10; n++) //先打表不然會超時的
{
memset(vis, 0, sizeof(vis));
sum = 0;
// 提前計算出1*1、2*2、3*3...等n皇后問題
DFS(1);
P[n] = sum;
}
while (scanf("%d", &n), n)
{
printf("%d\n", P[n]);
}
return 0;
}
相關文章
- n皇后問題--回溯法,以DFS的方式搜尋
- N皇后問題
- 7-22 n queens (10分) 八皇后(n皇后)問題
- 2020-11-18 N皇后問題
- N皇后問題(各種優化)優化
- N皇后和N皇后2
- [Hdfs] lc52. N皇后 II(dfs方案數+經典)
- 回溯法(排列樹)解決八(N)皇后問題
- N 皇后
- leetcode演算法題解(Java版)-9-N皇后問題LeetCode演算法Java
- 51,N皇后
- Leetcode每日一題:52.N-Queens II(N皇后Ⅱ)LeetCode每日一題
- P1219 八皇后(dfs)
- 20241201: 51. N 皇后
- 藍橋杯-N皇后
- 52. N皇后 II
- 洛谷八皇后問題
- 八皇后問題python解法Python
- LeetCode 52. N皇后 IILeetCode
- 演算法:N皇后二演算法
- HDU1427速算24點(dfs)
- HDU 1427-速算24點(DFS)
- 八皇后問題分析和實現
- hdu 6446 Tree and Permutation(dfs+思維)
- dfs的return時機問題
- 數獨問題(DFS+回溯)
- Leetcode 通過率最高的困難題 N皇后 II 【回溯解法-剪枝】LeetCode
- POJ1321棋盤問題(DFS)
- 從八皇后問題到回溯演算法演算法
- 演算法學習回顧-皇后問題演算法
- hdu2048遞迴問題遞迴
- hdu2049遞迴問題遞迴
- 決策樹減支問題(優化)dfs減支問題優化
- 八皇后問題的錯誤程式碼示範
- 簡單的揹包問題(入門)HDU2602 HDU2546 HDU1864
- 每日一題之拉低通過率 回溯演算法 leetcode 51 N皇后每日一題演算法LeetCode
- [20210626]find -mtime +N N -N時間問題補充.txt
- [20210625]find -mtime +N N -N時間問題補充.txt