1019 of search

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;
}

你可能感兴趣的:(1019 of search)