hdu 2553 N皇后问题
N皇后问题
这是第一次写DFS的问题,原来是会一点,但是现在忘得有点干净,重新看了看这八皇后的问题,当然,重新理解的时候依然遇到一些问题,参考了他人的博客@https://www.cnblogs.com/chenchengxun/p/3759278.html。
题目:
思路:这道题就是一个常见的DFS的问题。要求是每个皇后不能同时出现在同一行,同一列,同时,斜着也不行。由于是一行一行的放,所以不用考虑行的重复,列也好解决。但是,关键在于斜着的问题所以,我们可以分开讨论,左斜和右斜。
首先是左斜:
0 1 2 3 4
-1 0 1 2 3
-2 -1 0 1 2
-3 -2 -1 0 1
-4 -3 -2 -1 0
我们可以观察到,列 - 行 的差是相等的。
然后再观察下右斜:
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
列 + 行 的和是相等的。
由此,大规律我们已经发现了,只需按照DFS写出即可。
#include<iostream> #include<cstring> using namespace std; int sum,n, pan[3][50]; int p[50]; void DFS(int row){ int i; if (row == n + 1){ sum++; return; } for (i = 1; i <= n; i++){ if (pan[0][row - i + n] == 0 && pan[1][i] == 0 && pan[2][row + i] == 0){ pan[0][row - i + n] = pan[1][i] = pan[2][row + i] = 1; DFS(row + 1); pan[0][row - i + n] = pan[1][i] = pan[2][row + i] = 0; } } } int main(){ for (n = 1; n <= 10; n++){ memset(pan, 0, sizeof(pan)); sum = 0; DFS(1); p[n] = sum; } while (cin >> n&&n){ cout << p[n] << endl; } system("pause"); return 0; }