CODE[VS] 1295 N皇后问题

题目描述 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;
}


其中我一开始写的时候写的就是不含注释内的代码,然后想可不可以让代码简单一点,但是发现如注释那种写法的话就会让时间超时,所以还是采用原来的方法。
原文地址:https://www.cnblogs.com/chilumanxi/p/5136113.html