HDU-2553-N皇后问题

HDU-2553-N皇后问题

题目链接:HDU-2553

题目大意:在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。你的任务是,对于给定的N,求出有多少种合法的放置方法。

题目思路:采用回溯。一行一行的放皇后, 然后再递归判断是否与之前已放好的皇后有冲突,一旦有冲突,则不需要继续下一行的搜索,直接返回(省去不必要的枚举)。

以下是代码:

#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <string>
#include <cstring>
using namespace std;
int line[15];
int n;
int tot = 0;
int ans[15];
void dfs(int row)//第row行
{
    if (row == n)   //
    {
        tot++;
        return;
    }
    for (int i = 0; i < n; i++)
    {
        line[row] = i;  //假设第row行皇后放在i这列
        int ok = 1;
        for (int j = 0; j < row; j++)
        {   
            //判断前面row-1行,i列是否放了皇后,以及对角线是否有冲突
            if (line[j] == i || line[row] - row == line[j] - j || line[row] + row == line[j] + j)
            {
                ok = 0;
                break;
            }
        }
        if (ok)
        {
            dfs(row + 1);
        } 
    }
}
int main(){
    for (n = 1; n <= 10; n++)  //预处理,防止超时
    {
        tot = 0;
        dfs(0);
        ans[n] = tot;
    }
    while(cin >> n && n)
    {
        cout << ans[n] << endl;
    } 
    return 0;
}

你可能感兴趣的:(DFS,HDU,2553)