N皇后問題-DFS

八皇后問題,是一個古老而著名的問題,是回溯算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於1848年提出:在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。 高斯認爲有76種方案。1854年在柏林的象棋雜誌上不同的作者發表了40種不同的解,後來有人用圖論的方法解出92種結果。

然而這是N皇后哈哈哈哈哈~~~
可以去HDU或者ZJYYC試試

題目

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

輸入

測試數據由多組測試樣例組成。每組測試數據第一行輸入一個正整數 n ( 1 <= n <= 10 )

輸出

輸出有多少種合法的放置方法

樣例輸入

1
5

樣例輸出

1
10

代碼

#include<bits/stdc++.h>
using namespace std;
int t,n,m,a,b,sum;
int Map[20];
void dfs(int x){
    if(x==n){
        sum++;
        return;
    }
    int i,j;
    for(i=0;i<n;i++){
        for(j=0;j<x;j++){
            if(Map[j]==i||abs(x-j)==abs(Map[j]-i)){
                break;  //兩個點45度直線,兩條邊相等
            }
        }
        if(j==x){
            Map[x]=i;
            dfs(x+1);
        }
    }
}
int main(){
    while(scanf("%d",&n)!=EOF){
        memset(Map,0,sizeof(Map));
        sum=0;
        dfs(0);
        printf("%d\n",sum);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章