UVa 167 苏丹的继承人

UVa 167 苏丹的继承者

题意:类似于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]]);   
    }    
  }
}