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

数据范围及提示 Data Size & Hint

n<=13

(时限提高了,不用打表了)

分类标签 Tags 点此展开 

 
 
代码:
#include<cstdio>
using namespace std;
#define N 101
int a[N],b[N],c[N],d[N],n,tot;
void go(int i){
    for(int j=1;j<=n;j++){//寻找放置皇后的位置
        if(!b[j]&&!c[i+j]&&!d[i-j+n-1]){//寻找放置皇后的位置 //由于C++不能操作负数组,因此考虑加n-1
            a[i]=j;//摆放皇后
            b[j]=1;//宣布占领第j列
            c[i+j]=1;//占领两个对角线
            d[i-j+n-1]=1;
            if(i==n) tot++;//n个皇后都放置好,一种情况 
            else go(i+1);//继续递归放置下一个皇后
            b[j]=0;//递归返回即为回溯一步,当前皇后退出
            c[i+j]=0;
            d[i-j+n-1]=0;
        }
    }
}
int main(){
    scanf("%d",&n);
    go(1);
    printf("%d
",tot);
    return 0;
}
原文地址:https://www.cnblogs.com/shenben/p/5561554.html