这个题属于八皇后问题,只不过需要求出八皇后所在位置的数字和最大值。其实枚举所有情况,也就是8的全排列,但这其中仍有剪枝操作。在搜索过程中应该剪去斜线上不满足要求的情况(有2种)。
还是比较简单,
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAX 9
using namespace std;
int map[MAX][MAX],vis[MAX],loc[MAX],ans;
bool IsCorrect(int x)
{
for(int i=x-1,j=loc[x]-1;i>=1&&j>=1;i--,j--)
if(loc[i]==j)
return false;
for(int i=x-1,j=loc[x]+1;i>=1&&j<MAX;i--,j++)
if(loc[i]==j)
return false;
return true;
}
void DFS(int index)
{
if(index==MAX)
{
int sum=0;
for(int i=1;i<MAX;i++)
sum+=map[loc[i]][i];
ans=max(ans,sum);
return;
}
for(int i=1;i<MAX;i++)
if(!vis[i])
{
loc[index]=i;
if(IsCorrect(index))
{
vis[i]=1;
DFS(index+1);
vis[i]=0;
}
}
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
ans=0;
memset(loc,0,sizeof(loc));
for(int i=1;i<MAX;i++)
for(int j=1;j<MAX;j++)
scanf("%d",&map[i][j]);
DFS(1);
printf("%5d\n",ans);
}
return 0;
}