UVa 167:The Sultan's Successors, 八皇后问题

题目链接:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=108&page=show_problem&problem=103

题目类型: 回溯

原题:

The Sultan of Nubia has no children, so she has decided that the country will be split into up to k separate parts on her death and each part will be inherited by whoever performs best at some test. It is possible for any individual to inherit more than one or indeed all of the portions. To ensure that only highly intelligent people eventually become her successors, the Sultan has devised an ingenious test. In a large hall filled with the splash of fountains and the delicate scent of incense have been placed k chessboards. Each chessboard has numbers in the range 1 to 99 written on each square and is supplied with 8 jewelled chess queens. The task facing each potential successor is to place the 8 queens on the chess board in such a way that no queen threatens another one, and so that the numbers on 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 no more than one.)

Write a program that will read in the number and details of the chessboards and determine the highest scores possible for each board under these conditions. (You know that the Sultan is both a good chess player and a good mathematician and you suspect that her score is the best attainable.)

题目大意:

Sultan没有孩子,所以她决定做一个测试,选择一个继承人。 这个测试内容是, 有一个8*8的棋盘, 棋盘上的每个格子上都有

一个1~99的数字。然后,要放8个皇后上去,使它们不能同行,同列,同斜线,  并且求出8个放置位置上的数字之和最大

的值。

分析与总结:

赤裸裸的八皇后问题了,只是增加了个求和的步骤。

首先, 可以得出这8个皇后一定是在不同行上的, 然后,还可以进一步判断每一行上的列坐标都是不同的,即恰好每行每列

放置一个皇后。这样,就只需要再判断是否斜线上有冲突即可。

接下来就好办了,我们可以开一个数组loc[9] = {0,1,2,3,4,5,6,7},   数组下标对应行,数组元素的值对应该行的列。 我们只需要

枚举loc的全排列, 然后写一个judge函数来判断这个排列方案是否符合八皇后规则即可,如果符合的话,就计算棋盘上对应的

值的和,更新维护一个全局的最大值即可。

0~7的排列一共有8!=40320个, 而枚举两不会超过这个。

1. 暴力枚举法

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define MOD
using namespace std;
int map[8][8];
int loc[8];  

bool judge(){
    for(int i=1; i<8; ++i){
        for(int j=0; j<i; ++j){
            if(i-j==loc[i]-loc[j] || i-j==loc[j]-loc[i])
                return false;
        }
    }
    return true;
}  

int main(){
#ifdef LOCAL
    freopen("input.txt","r",stdin);
#endif
    int T;
    scanf("%d",&T);
    while(T--){
        for(int i=0; i<8; ++i)
            for(int j=0; j<8; ++j)
                scanf("%d", &map[i][j]);  

        for(int i=0; i<8; ++i)
            loc[i] = i;
        int maxVal = -1;  

        do{
            if(judge()){
                int sum=0;
                for(int i=0; i<8; ++i)
                    sum += map[i][loc[i]];
                if(sum > maxVal) maxVal = sum;
            }
        }while(next_permutation(loc, loc+8));  

        printf("%5d\n", maxVal);
    }
    return 0;
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数组
, 八皇后
, and
, 一个
, The
, 8皇后
, 棋盘
that
八皇后问题、八皇后问题 c语言、八皇后问题c、八皇后问题答案、八皇后问题java,以便于您获取更多的相关知识。

时间: 2024-11-02 22:25:13

UVa 167:The Sultan's Successors, 八皇后问题的相关文章

uva 167 - The Sultan&#039;s Successors

点击打开链接 题目意思:给定8 x 8的一个方格,对于该方格来说每一行上面只能取一个数,然后同行同列同对角线上都是不满足,求出所能得到的最大值 解题思路:8皇后的变形问题,变为求解所有方案数中的最大的和.我们先分序一下,该解空间的结构,由于每一行只能取一,那么我么就可以知道每一行对应的是解空间的一层,那么我么就可以去搜索这个解空间状态树,从第一行开始搜索,如果行数大于8就return,比较最大的值,在搜索函数里面我们用一个for循环枚举每一列,求出满足条件的一列,通过judge函数去判断,只要判

UVa 639:Don&#039;t Get Rooked, 类八皇后问题

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=108&page=show_problem&problem=580 题目类型: 暴力, 回溯法 题目: In chess, the rook is a piece that can move any number of squares vertically or horizontally. In this p

八皇后问题的C#解答

解答|问题 改编自V星[视窗王子]应答程序,如下:<br><br>using System;<br>class Queen{<br>    const int SIZE = 8;//皇后数<br>    public static void Main()<br>    {<br>        int[] Queen = new int [SIZE];//每行皇后的位置<br>        int y,x,i

基于Delphi的八皇后问题动态实现

摘要 对于八皇后问题的实现,如果结合动态的图形演示,则可以使算法的描述更形象.更生动,使教学能产生良好的效果. 关键词 八皇后问题 冲突 数据结构 线程类 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 下面用delphi6实现的八皇后问题的动态图形程序,能够演示全部的92组解.八皇后问题动态图形的实现,主要应解决以下

常用算法:C#八皇后问题

八皇后问题是一个古老而著名的问题,是回溯算法的典型应用.八皇后问题就是棋盘上的8个皇后不能在同一行.一列或一条斜线上,在8!=40320种排列中共有92种解决方案.代码如下: using System; using System.Collections.Generic; using System.Text;namespace ExQueen { class Queen { public void QueenArithmetic(int size){ int[] Queen = new int[s

python基于右递归解决八皇后问题的方法

  本文实例讲述了python基于右递归解决八皇后问题的方法.分享给大家供大家参考.具体分析如下: 凡是线性回溯都可以归结为右递归的形式,也即是二叉树,因此对于只要求一个解的问题,采用右递归实现的程序要比回溯法要优美的多. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 def Test(queen,n): '''这个就不用说了吧,就是检验第n(下标,0-7)行皇后的位置是否合理''' q=que

javascript递归回溯法解八皇后问题

  javascript递归回溯法解八皇后问题:           网上看到许多关于八皇后算法的文章,很少能看到使用javascript来实现的,今天就给大家使用javascript来解决下这个问题,有需要的小伙伴可以参考下. 下面给大家分享的是回溯法解八皇后, 带详细注解,这里就不多废话了. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

c语言-C++中的八皇后问题,编译通过了,但执行的时候为什么直接显示按任意键返回

问题描述 C++中的八皇后问题,编译通过了,但执行的时候为什么直接显示按任意键返回 #include//8*8的棋盘 #define max 8 int i,j; int e,s; char queen[max][max]; int main() { void fz(); void put(); void check(); void show(); void checkandput(); void checkagain(); for(i=0;i<max;i++) for(j=0;j<max;j

swift未解决八皇后的问题代码

问题描述 swift未解决八皇后的问题代码 首先提一下八皇后的问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 代码问题:用下面我自己的方法实现的八皇后,结果出现了无尽的循环.可能是思路还是哪里的不严谨?请教大伙帮忙改改!我已经尽力了... 注:代码可以直接粘贴复制进xcode的playground进行测试! class ChessBoard { var limit: Intvar queens = [Queen](