深搜,8皇后问题
本题要点:
1、打表:
n皇后问题的数量,放在 ans 数组, 输出 ans[n]
2、检查 皇后放在 第r行,第c列位置:
此时,第0 ~ r - 1 行的皇后已经确定。检查 0 ~ r - 1 行 的皇后是否和 (r, c)发生冲突。
3、DFS
for(n = 0; n <= 10; ++n), 对于每一个n, 一行一行地放皇后,
最后统计有多少种放法。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
int n, tot;
int col[12]; //col[i] 表示第i行的皇后放在第 col[i]
int ans[12];bool check(int c, int r) //检查在 第r行,第c列位置是否能放皇后
{
for(int i = 0; i < r; ++i){
if(col[i] == c || (abs(col[i] - c)) == abs(i - r)){
return false;}}return true;
}void dfs(int r) //一行一行放皇后
{
if(r == n) {
++tot;return;}for(int c = 0; c < n; ++c){
if(check(c, r)){
col[r] = c; //第r行的皇后,放在第c列的位置dfs(r + 1);}}
}int main()
{
for(n = 0; n <= 10; ++n){
memset(col, 0, sizeof col);tot = 0;dfs(0);ans[n] = tot;}while(scanf("%d", &n) != EOF && n){
printf("%d\n", ans[n]); }return 0;
}/* 1 8 5 0 *//* 1 92 10 */