八王后问题,回溯算法
代码如下:
#include <bits/stdc++.h>
using namespace std;
int number=0,x[10],y[100][10];
void D()//存储王后位置
{
for(int i=1; i<=8; i++)
y[number][i]=x[i];
number++;
}
int C(int n)
{
return n<0?(-n):n;
}
bool B(int n)//判断王后位置是否合理
{
for(int i=1; i<n; ++i)
if(x[i]==x[n]||C(x[i]-x[n])==(n-i))
return false;
return true;
}
void A(int n)//回溯王后位置
{
for(int i=1; i<=8; ++i)
{
x[n]=i;
if(B(n))
{
if(!(n-8))
D();
else
A(n+1);
}
}
}
int main()
{
A(1);
int i,j,k,n,Max,sum,z[10][10];
cin>>n;
for(i=1; i<=n; ++i)
{
for(j=0; j<8; ++j)
for(k=0; k<8; ++k)
cin>>z[j][k];
Max=0;
for(j=0; j<number; ++j)
{
sum=0;
for(k=1; k<=8; ++k)
sum+=z[k-1][y[j][k]-1];
Max=max(Max,sum);
}
cout<<setw(5)<<Max<<endl;
}
return 0;
}