1. 程式人生 > >hdu2553八皇后問題(DFS)

hdu2553八皇后問題(DFS)

在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。
你的任務是,對於給定的N,求出有多少種合法的放置方法。

Input共有若干行,每行一個正整數N≤10,表示棋盤和皇后的數量;如果N=0,表示結束。Output共有若干行,每行一個正整數,表示對應輸入行的皇后的不同放置數量。Sample Input
1
8
5
0
Sample Output
1
92
10
DFS搜尋題

打表防止超時!

程式碼

#include<iostream>
using namespace std;
long long ans[12];      //打表儲存答案
long long cnt;
int vis[12][12];        //這個就是棋盤了,等於0就是沒放棋子,等於1就是放了
bool check(int r,int c)          //判斷能不能放
{
    for(int i=1;i<r;i++)         //因為是一行一行遞迴過來的,所以只要檢查這一列有沒有
        if(vis[i][c])
        return false;
    for(int i=c,j=r;i<=10&&j>=1;i++,j--)  //對角線
        if(vis[j][i])
        return false;
    for(int i=c,j=r;i>=1&&j>=1;i--,j--)   //對角線
        if(vis[j][i])
        return false;
    return true;
}
void trial(int i,int n)          //表示此時已經在前i-1行放了棋子了,總共有n*n的棋盤
{
    if(i>n)                      //說明已經放了n個棋子了
        cnt++;
    else                         //咱接著放
        for(int j=1;j<=n;j++)
        if(check(i,j))
        {
            vis[i][j]=1;         //放下去就標記
            trial(i+1,n);
            vis[i][j]=0;         //拿起來就取消標記,還原現場
        }
}
void f()             //開開心心算完結果
{
    for(int i=1;i<11;i++)
    {
        cnt=0;
        trial(1,i);
        ans[i]=cnt;
    }
}
int main()
{
    int N;
    f();
    while(cin>>N&&N)
    {
        cout<<ans[N]<<endl;
    }
    return 0;
}
/*
1 1 

2 0

3 0

4 2

5 10

6 4

7 40

8 92

9 352

10 724

*/