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]]);
    }
  }
}
时间: 2024-10-20 23:29:45

UVa 167 苏丹的继承者的相关文章

The Sultan&#39;s Successors UVA - 167

the squares thus selected sum to a number at least as high as one already chosen by the Sultan. (For those unfamiliar with the rules of chess, this implies that each row and column of the board contains exactly one queen, and each diagonal contains n

The Sultan&#39;s Successors UVA 167(八皇后问题)

说说: 其实这道题本质上就是一个八皇后问题.唯一的区别就是每个棋盘的格子都对应一个数字.最后要求输出,对应的解占据的格子的和的最大值.这只要在最后求出解的时候统计一下就可以了.下面就简单的说说八皇后问题,其实解法也不难.因为要求每行每列都要有棋子.因此只要确定每一行对应的棋子的列数就可以了.而对于每个棋子的所放的位置,同列上和对角线上不能有其他棋子,这个只要设一个访问数组保存一下就可以了.(注意要记得回溯).至于对角线的表示方法,例如所在位置为(x,y),那么一条对角线可以用x+y表示,另一条对

Uva 167 The Sultan&#39;s Successors

题目链接:Uva 167 思路:     八皇后问题,采用回溯法解决问题. 代码: #include <iostream> #include <string.h> using namespace std; const int MAX_N = 10; int A[MAX_N]; int M[MAX_N][MAX_N]; int num, Max = 0; int is_safe( int row, int col ) { for ( int i = 0; i < row; ++

uva 167 - The Sultan&amp;#39;s Successors(典型的八皇后问题)

这道题是典型的八皇后问题,刘汝佳书上有具体的解说. 代码的实现例如以下: #include <stdio.h> #include <string.h> #include <stdlib.h> int vis[100][100];//刚開始wrong的原因就是这里数组开小了,开了[8][8],以为可以.后来看到[cur-i+8]意识到可能数组开小了.改大之后AC. int a[8][8]; int C[10]; int max_,tot; void search_(int

UVa 167(八皇后)、POJ2258——记两个简单回溯搜索

UVa 167 题意:八行八列的棋盘每行每列都要有一个皇后,每个对角线上最多放一个皇后,让你放八个,使摆放位置上的数字加起来最大. 参考:https://blog.csdn.net/xiaoxiede_wo/article/details/79973171 1 #include <iostream> 2 #include <cstring> 3 #include <iomanip> 4 using namespace std; 5 int pic[9][9]; 6 in

[题解]UVa 11082 Matrix Decompressing

开始眨眼一看怎么也不像是网络流的一道题,再怎么看也觉得像是搜索.不过虽然这道题数据范围很小,但也不至于搜索也是可以随随便便就可以过的.(不过这道题应该是special judge,因为一题可以多解而且题目中然而并没有什么要求,所以说可以考虑思考一下这道题有木有什么"套路"之类的通法) 比如说有这么一组数据 原矩阵 1 2 3 4 7 8 9 5 6 输入 3 3 6 25 45 14 28 45 然后将每一行的和写在每一列对应的行上(很明显有问题) 6 0 0 19 0 0 20 0

[题解]uva 1658 Admiral

vjudge传送门[here] 题目大意:给一个有(3≤v≤1000)个点e(3≤e≤10000)条边的有向加权图,求1~v的两条不相交(除了起点和终点外没有公共点)的路径,使权值和最小. 正解是吧2到v-1的每个点拆成两个点,中间连一条容量为1,费用为0的边,然后求1到v的流量为2的最小费用流就行了. Code 1 /** 2 * Uva 3 * Problem#1658 4 * Accepted 5 */ 6 #include<iostream> 7 #include<cstdio&

UVA 11324 The Largest Clique (强连通分量缩点,图DP)

题目: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&page=show_problem&problem=2299 题意: 给你一个有向图,求一个点集合的最大大小,使得此点集合中对于任意点对(u,v),有从u到v或者从v到u的边 方法: 先找强连通分量缩点,每个强连通分量显然满足条件,然后在缩点后的图中找到一条权值最大的路径,权值为此路径的点权之和,点权为这个

UVA 231 Testing the CATCHER

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=4&page=show_problem&problem=167 这道题实际上就是在一个序列中找出最长的非降sub序列.第一个序列就是原序列,第二个是排序过的非降序列,然后找出Longest common substring,就是答案. 代码如下: #include <iostream> #incl