八皇后问题 回溯

来源:互联网 发布:淘宝李宁乒乓球运动服 编辑:程序博客网 时间:2024/04/30 09:52

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

题意:

棋盘上放置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;}
0 0