题意:类似于8皇后问题,只不过棋盘上每个格子都有个分数,皇后所在的位置即可以得到的分数。还是8皇后问题的规则,最后求得最大可得到的分数。
思路:8皇后问题解法,在放完8个皇后后判断一下得到的分数就行了。
在 if 语句的判断内容那块竟然还写错一次,不满意~
也可以用vis[3][2*8];数组标记,然后会快一点
Code:
#include<stdio.h>
void dfs(int cur,int score);
int chess[8][8];
int bestscore;
int C[8];
int main()
{
//freopen("167.in","r",stdin);
//freopen("167.out","w",stdout);
int k;
scanf("%d",&k);
while(k-->0)
{
for(int i=0;i<8;++i)
for(int j=0;j<8;++j)
{
scanf("%d",&chess[i][j]);
}
bestscore=0;
dfs(0,0);
printf("%5d\n",bestscore);
}
return 0;
}
void dfs(int cur,int score)
{
if(cur==8)
{
bestscore=score>bestscore?score:bestscore;
}
else
for(int i=0;i<8;++i)//尝试每一列
{
C[cur]=i;
int ok=1;
for(int j=0;j<cur;++j)//下面if语句中是cur而不是i。。。
if(C[cur]==C[j] || C[cur]+cur==C[j]+j || C[cur]-cur==C[j]-j) { ok=0; break;}
if(ok)
{
dfs(cur+1,score+chess[cur][C[cur]]);
}
}
}