当前位置: 代码迷 >> 综合 >> HOJ 2553 N皇后问题(深搜)
  详细解决方案

HOJ 2553 N皇后问题(深搜)

热度:72   发布时间:2023-12-13 19:25:51.0

深搜,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 */