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;
}
发布了69 篇原创文章 · 获赞 16 · 访问量 9754

猜你喜欢

转载自blog.csdn.net/ChenZIDu/article/details/104672706