1295 N皇后问题

1295 N皇后问题

 

时间限制: 2 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
 
 
 
题目描述 Description

在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于再n×n的棋盘上放置n个皇后,任何2个皇后不妨在同一行或同一列或同一斜线上。

输入描述 Input Description

 给定棋盘的大小n (n ≤ 13)

输出描述 Output Description

 输出整数表示有多少种放置方法。

样例输入 Sample Input

8

样例输出 Sample Output

92

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<iomanip>
using namespace std;
bool d[100]= {0},b[100]= {0},c[100]= {0};
int sum=0,a[100];
int search(int);
int n;
int print();
int main() 
{
    cin>>n;
    search(1);  
    cout<<sum;                                                        //从第1个皇后开始放置
}
int search(int i) 
{
    int j;
    for (j=1; j<=n; j++)                                            //每个皇后都有8位置(列)可以试放
    if ((!b[j])&&(!c[i+j])&&(!d[i-j+7]))                   //寻找放置皇后的位置
    { //由于C++不能操作负数组,因此考虑加7
            //放置皇后,建立相应标志值
            a[i]=j;                                                          //摆放皇后
            b[j]=1;                                                         //宣布占领第j列
            c[i+j]=1;                                                      //占领两个对角线
            d[i-j+7]=1;
            if (i==n) print();                                           //8个皇后都放置好,输出
            else search(i+1);                                      //继续递归放置下一个皇后
            b[j]=0;                                                        //递归返回即为回溯一步,当前皇后退出
            c[i+j]=0;
            d[i-j+7]=0;
        }
}
int print() 
{
    int i;
    sum++;                                                        //方案数累加1
}
原文地址:https://www.cnblogs.com/lyqlyq/p/6607587.html