题目描述 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; }
其中我一开始写的时候写的就是不含注释内的代码,然后想可不可以让代码简单一点,但是发现如注释那种写法的话就会让时间超时,所以还是采用原来的方法。