计蒜客深搜---八皇后问题

该题是求一个数(n)全排列的一个变形题,在搞懂这道题之前我们要搞懂全排列的dfs写法。在此基础上进行更改。

如果对全排列的dfs写法不是很熟练,我们先解决这个问题。

全排列可以看成分别从1到n开头,组成的不重复的数列问题。那么递归死胡同就是该数列的长度等于n,岔路口就是当前这个数该不该选。

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const long long maxn = 35;
int p[10];
int vis[10];
bool flag = false;
int maxLen=0,sum=0;
int mp[8][8];
void dfs(int index)
{
    if(index == 4)
    {
         for(int i=0; i<4; i++)
         {
             cout<<p[i]+1<<" ";
         }
            cout<<endl;
    }
    for(int i=0; i<4; i++)
    {
        if(vis[i] == 0)
        {
            p[index] = i;
            vis[i] = 1;
            dfs(index+1);
            vis[i] = 0;
        }
    }
}
int main()
{
    for(int i=0; i<10; i++)
        vis[i] = 0;
    dfs(0);
    cout<<maxLen<<endl;
    return 0;
}

代码如下;

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const long long maxn = 35;
int p[10];
int vis[10];
bool flag = false;
int maxLen=0,sum=0;
int mp[8][8];
void dfs(int index)
{
    if(index == 8)
    {
        bool flag = true;
        for(int i=0; i<8; i++)
        {
            for(int j=i+1; j<8; j++)
            {
                if(abs(i-j)==abs(p[i]-p[j]))
                {
                    flag = false;
                }
            }
        }
        if(flag)
        {
            for(int i=0; i<8; i++)
            {
                sum+=mp[p[i]][i];
            }
            if(sum > maxLen)
                maxLen = sum;
            sum = 0;
        }
    }
    for(int i=0; i<8; i++)
    {
        if(vis[i] == 0)
        {
            p[index] = i;
            vis[i] = 1;
            dfs(index+1);
            vis[i] = 0;
        }
    }
}
int main()
{
    for(int i=0; i<10; i++)
        vis[i] = 0;
    for(int i=0; i<8; i++)
    {
        for(int j=0; j<8; j++)
        {
            cin>>mp[i][j];
        }
    }
    dfs(0);
    cout<<maxLen<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38851184/article/details/81603178
今日推荐