题目描述 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
(时限提高了,不用打表了)
N皇后问题这个题为了可以使用DFS,把时间宽限到了2S钟,如此就可以愉快的使用DFS了,一个比较简单的DFS,很多人都是用一维数组做的,我使用二维数组做的,代码如下:
/*************************************************************************
> File Name: N皇后问题.cpp
> Author: zhanghaoran
> Mail: chilumanxi@gmail.com
> Created Time: 2015年07月17日 星期五 16时35分22秒
************************************************************************/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <math.h>
using namespace std;
int n;
int temp = 0;
int map[14][14];
int ans = 0;
int check(int num, int x){
for(int i = 1; i <= n; i ++){
if(map[i][x] || map[num][i])
return 0;
}
for(int i = 1; num - i > 0 && x - i > 0; i ++){
if(map[num - i][x - i])
return 0;
}
for(int i = 1; num + i <= n && x + i <= n; i ++){
if(map[num +i][x + i])
return 0;
}
for(int i = 1; num + i <= n && x - i > 0; i ++){
if(map[num + i][x - i])
return 0;
}
for(int i = 1; num - i > 0 && x + i <= n; i ++){
if(map[num - i][x + i])
return 0;
}
return 1;
}
/*
int check(int num, int x){
for(int i = 1; i <= num; i ++){
if(map[i][x])
return 0;
for(int j = 1; j <= 13; j ++){
if(map[i][j]){
if(fabs(i - num) - fabs(j - x) == 0){
return 0;
}
else
break;
}
}
}
return 1;
}
*/
void dfs(int num){
if(num == n + 1){
ans ++;
return ;
}
for(int i = 1; i <= n; i ++){
if(check(num, i)){
map[num][i] = 1;
dfs(num + 1);
map[num][i] = 0;
}
}
return ;
}
int main(void){
memset(map, 0, sizeof(map));
cin >> n;
dfs(1);
cout << ans << endl;
return 0;
}
其中我一开始写的时候写的就是不含注释内的代码,然后想可不可以让代码简单一点,但是发现如注释那种写法的话就会让时间超时,所以还是采用原来的方法。