UVA 167 - The Sultan's Successors

八皇后问题的变形,这道题不是要我们求有多少种方法,而是在给定价值的棋盘格子放皇后,使得

皇后放置的位置的总价值最大。参考了白书的126页的代码,用vis数组表示已经放置的皇后占据了

哪些列以及哪些主、副对角线。然后将放置皇后,改成加上该格子的值。不能忘了将vis初始化false

和最后的输出的%5d。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#define MAXN 10

const int N = 8;
int val[MAXN][MAXN], max, ans;
bool vis[MAXN][MAXN];

void dfs( int cur)
{
for( int i = 0; i < N; i ++)
{
if( !vis[0][i] && !vis[1][cur + i] && !vis[3][cur - i + N - 1])
{
ans += val[cur][i];
vis[0][i] = vis[1][ cur + i] = vis[3][cur - i + N - 1] = true;
if( cur == N - 1 && ans > max)
max = ans;
else
dfs( cur + 1);
ans -= val[cur][i];
vis[0][i] = vis[1][ cur + i] = vis[3][cur - i + N - 1] = false;
}
}
}

int main()
{
int T;
scanf( "%d", &T);
while( T --)
{
for( int i = 0; i < N; i ++)
for( int j = 0; j < N; j ++)
scanf( "%d", &val[i][j]);
memset( vis, false, sizeof vis);
max = ans = 0;
dfs( 0);
printf( "%5d\n", max);
}
return 0;
}



你可能感兴趣的:(SSO)