码迷,mamicode.com
首页 > 其他好文 > 详细

八皇后(dfs+回溯)

时间:2016-09-07 19:19:00      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

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

方法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+回溯)

标签:

原文地址:http://www.cnblogs.com/geloutingyu/p/5850270.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!