N皇后问题
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 56 Accepted Submission(s) : 26
Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。<br>你的任务是,对于给定的N,求出有多少种合法的放置方法。<br><br>
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1<br>8<br>5<br>0<br><br>
Sample Output
1<br>92<br>10<br><br>
Author
cgf
Source
2008 HZNU Programming Contest
题目要求:在一个n阶方阵里面放入n个皇后,使她们每行每列和斜对角线没有另一个皇后。
解题思路:这是一个经典的问题,如果普通的dfs会超时,一直看不懂别人的博客,但在硬着头皮看了两天后终于看懂了。
所以可行的方法1达表n为10以内,所以只有算出来即可。
2用回溯法进行 从第一行到最后一行,没完成一次便标记一次并向上一层回溯一次,取下一个能取的位置,最后回溯到初始状态未结束。 3用位运算进行操作,可以极大的压缩时间,但是太难理解了,必须位运算很熟才行,当然也是同2法,只是用按位来运算和储存。
# include <iostream>
using namespace std;
int main()
{
int n;
int a[11] = {0, 1, 0, 0, 2, 10, 4, 40, 92, 352, 724};
while(cin >> n)
{
if(n == 0)
break;
cout << a[n] << endl;
}
return 0;
}