很简单的八皇后题目。
单纯递归筛选。。。。
分别用y-x, x+y,来标识对角线,这在刘汝佳书上都有讲的。
代码如下:
#include <cstdio>
int chess[8][8], lu_to_rd[14], ru_to_ld[14], l[8], max; //lu_to_rd 表示主对角线(left&up to right&down)
//同理,ru_to_ld标识副对角线
void dfs(int cur, int sum)
{
if(cur==8)
{
max = max < sum ? sum : max ;
return;
}
for(int i = 0; i < 8; i++)
{
if(!l[i]&&!lu_to_rd[i-cur+7]&&!ru_to_ld[i+cur])
{
l[i] = lu_to_rd[i-cur+7] = ru_to_ld[i+cur] = 1;
dfs(cur+1,sum+chess[cur][i]);
l[i] = lu_to_rd[i-cur+7] = ru_to_ld[i+cur] = 0;
}
}
}
int main ()
{
int k;
scanf("%d",&k);
while(k--)
{
for(int i = 0; i < 8; i++) for(int j = 0; j < 8; j++)
scanf("%d",&chess[i][j]);
max = -1;
dfs(0, 0);
printf("%5d\n",max);
}
}