该题是求一个数(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;
}