八皇后问题 回溯

作为回溯法的典型,水一下。

题意:

棋盘上放置8个皇后,每个皇后的攻击范围为同行同列和同对角线。要求找出所有解,使得她们互不攻击。

分析:

回溯法。
逐行放置,对列和对角线进行检查,使用vis数组保存状态。回溯注意在各个出口都要将条件“恢复原状”。

代码:

#include<iostream>
using namespace std;
const int maxn = 25;
int cnt = 0, m , n;
int vis[3][maxn], ans[maxn];
void dfs(int row)
{
    if(row == n){
        cnt++;
        return;
    }
    for(int i = 0; i < m; i++){
        if(!vis[0][i]&&!vis[1][i- row + n] && !vis[2][i + row]){
            vis[0][i] = vis[1][i - row + n] = vis[2][i + row] = 1;
            ans[row] = i;//打印解
            dfs(row + 1);
            vis[0][i] = vis[1][i - row + n] = vis[2][i + row] = 0;
        }
    }

}
int main (void)
{
    m = n = 8;
    dfs(0);
    cout<<cnt<<endl;
}
原文地址:https://www.cnblogs.com/Tuesdayzz/p/5758731.html