八皇后(dfs+回溯)

Posted ygeloutingyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八皇后(dfs+回溯)相关的知识,希望对你有一定的参考价值。

重看了一下刘汝佳的白板书,上次写八皇后时并不是很懂,再写一次:

方法1:逐行放置皇后,然后递归;

代码:

#include <bits/stdc++.h>
#define MAXN 8
#define ll long long
using namespace std;

ll ans=0;
int c[MAXN];

void dfs(int cur)
{
    if(cur==MAXN) ans++;   //***因为是逐行放置的,所以只要走到最后一行则肯定可行
    else
    {
        for(int i=0; i<MAXN; i++)    //***尝试在第cur行的第i列放置皇后
        {
            int flag=1;
            c[cur]=i;
            for(int j=0; j<cur; j++)
            {
                if(c[cur]==c[j]||c[cur]+cur==j+c[j]||c[cur]-cur==c[j]-j)  //**判断皇后是否会相互攻击
                {
                    flag=0;
                    break;
                }
            }
            if(flag)
            {
                dfs(cur+1);  //***如果合法,继续递归
            }
        }
    }
}

int main(void)
{
    dfs(0);
    cout << ans << endl;
    return 0;
}



方法2:思路和方法1差不多,区别是用二维数组vis[2][]来标记之前皇后的位置,判断是否会相互攻击

代码:

#include <bits/stdc++.h>
#define MAXN 8
#define ll long long
using namespace std;

ll ans=0;
int c[MAXN], vis[3][2*MAXN];

void dfs(int cur)
{
    if(cur==MAXN) ans++;   //***因为是逐行放置的,所以只要走到最后一行则肯定可行
    else
    {
        for(int i=0; i<MAXN; i++)    
        {
            if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+MAXN])
            {
                c[cur]=i;                        //***尝试将皇后放置在第cur行第i列     
                vis[0][i]=vis[1][cur+i]=vis[2][cur-i+MAXN]=1;  //**标记
                dfs(cur+1);                                 //**递归
                vis[0][i]=vis[1][cur+i]=vis[2][cur-i+MAXN]=0; //**去除标记
            }
        }
    }
}

int main(void)
{
    dfs(0);
    cout << ans << endl;
    return 0;
}

 

以上是关于八皇后(dfs+回溯)的主要内容,如果未能解决你的问题,请参考以下文章

暴力穷举和回溯法(八皇后问题)

求教C语言回溯法写出八皇后问题的92种解

八皇后问题算法详解

回溯算法解八皇后问题(java版)

八皇后,回溯与递归(Python实现)

回溯法解决八皇后问题