问题 D: 【递归入门】n皇后 问题(原始的8皇后问题) 时间限制: 1 Sec 内存限制: 128 MB 献花: 40 解决: 28 [献花][花圈][TK题库] 题目描述 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
输入 一个整数n( 1 < = n < = 10 ) 输出 每行输出对应一种方案,按字典序输出所有方案。每种方案顺序输出皇后所在的列号,相邻两数之间用空格隔开。如果一组可行方案都没有,输出“no solute!” 样例输入 4 样例输出 2 4 1 3 3 1 4 2
#include <iostream> #include <cmath> using namespace std; const int MaxN = 25; int c = 0 ,Data[MaxN] = {0}; bool hashTable[MaxN] = {0}; void DFS(int n,int k) { if(k > n) { for(int i=1;i<=n;++i) { cout << Data[i]; if(i != n) cout << " "; } cout << endl; ++c; } for(int i = 1;i<=n;++i) { if(hashTable[i] == false) { bool isvalid = true; for(int m = 1;m < k;++m) { if(k-m == abs(i-Data[m])) { isvalid = false; break; } } if(isvalid) { hashTable[i] = true; Data[k] = i; DFS(n,k+1); hashTable[i] = false; } } } } int main() { #ifdef _Debug freopen("data.txt","r+",stdin); #endif // _Debug int n; while(cin >> n) { c=0; DFS(n,1); if(c == 0) cout << "no solute!"<<endl; } return 0; } /************************************************************** Problem: 5976 User: Sharwen Language: C++ Result: 升仙 Time:4 ms Memory:1704 kb ****************************************************************/