洛谷P1930 亚瑟王的宫殿 Camelot

P1930 亚瑟王的宫殿 Camelot

    • 19通过
    • 53提交
  • 题目提供者JOHNKRAM
  • 标签USACO
  • 难度提高+/省选-

提交  讨论  题解

最新讨论

  • 暂时没有讨论

题目描述

很久以前,亚瑟王和他的骑士习惯每年元旦去庆祝他们的友谊。为了纪念上述事件, 我们把这些故事看作是一个棋盘游戏。有一个国王和若干个骑士被放置在一个由许多方格 组成的棋盘上,没有两个骑士在同一个方格内。

这个例子是标准的 8*8 棋盘

国王可以移动到任何一个相邻的方格,从下图中黑子位置到下图中白子位置前提是他 不掉出棋盘之外。

一个骑士可以从下图中黑子位置移动到下图中白子位置(走“日”字形) 但前提是他 不掉出棋盘之外。

在游戏中,玩家可在每个方格上放不止一个棋子,假定方格足够大,任何棋子都不会 阻碍到其他棋子正常行动。

玩家的任务就是把所有的棋子移动到同一个方格里——用最小的步数。为了完成这个 任务,他必须按照上面所说的规则去移动棋子。另外,玩家可以选择一个骑士跟国王从他 们两个相遇的那个点开始一起行动,这时他们按照骑士的行动规则行动,其他的单独骑士 则自己一直走到集中点。骑士和国王一起走的时候,只算一个人走的步数。

请计算他们集中在一起的最小步数,而且玩家必须自己找出这个集中点。当然,这些 棋子可以在棋盘的任何地方集合。

输入输出格式

输入格式:

第一行: 两个用空格隔开的整数:R,C 分别为棋盘行和列的长。不超过 26 列,40 行。

第二行到结尾: 输入文件包含了一些有空格隔开的字母/数字对,一行有一个或以 上。第一对为国王的位置,接下来是骑士的位置。可能没有骑士,也可能整个棋盘都是骑 士。行从 1 开始,列从大写字母 A 开始。

输出格式:

单独一行表示棋子集中在一个方格的最小步数。

输入输出样例

输入样例#1:

8  8
D  4
A  3  A  8
H  1  H  8

输出样例#1:

10

说明

【样例说明】

他们集中在 B5。

骑士 1: A3 - B5 (1 步)

骑士 2: A8 - C7 - B5 (2 步)

骑士 3: H1 - G3 - F5 - D4 (此时国王开始与这个骑士一起走) - B5 (4 步) 骑士 4: H8 - F7 - D6 - B5 (3 步)

1 + 2 + 4 + 3 = 10 步

题目翻译来自NOCOW。

USACO Training Section 3.3

分析:这道题是一道很明显的搜索题,因为集合点没告诉,所以要枚举集合点,这样的话涉及到多次计算,先进行预处理,处理每两个点之间距离,因为是无权无向图,用bfs就可以了,如果不考虑骑士背国王的话,只需要把所有骑士的点到集合点的距离加起来并加上国王与集合点的横纵坐标的差的最大值即可(国王可以八个方向走),如果考虑背国王的话,有点麻烦.首先你不知道是哪个骑士背国王,然后不知道在哪背,因为国王也要走动,这样的话枚举背的骑士和背的地点,根据之前预处理好的数组计算即可.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>

using namespace std;

int r, c, dis[31][27][31][27],num,ans = 100000000;

const int dr[8] = { -2,-1,1,2,2,1,-1,-2 };
const int dc[8] = { 1,2,2,1,-1,-2,-2,-1 };

struct node
{
    int r, c;
}king,qishi[800];

bool vis[31][27];

bool check(int x, int y)
{
    if (x >= 1 && x <= r && y >= 1 && y <= c)
        return true;
    return false;
}

void bfs(int x,int y) {
    int r, c, step;
    queue<node> q;
    node temp;
    temp.r = x;
    temp.c = y;
    q.push(temp);
    memset(vis, false, sizeof(vis));
    dis[x][y][x][y] = 0;
    vis[x][y] = true;

    while (!q.empty()) {
        node u = q.front();
        q.pop();
        step = dis[x][y][u.r][u.c];
        for (int i = 0;i<8;++i) {
            int r = u.r + dr[i];
            int c = u.c + dc[i];
            if (check(r, c) && !vis[r][c]) {
                vis[r][c] = true;
                dis[x][y][r][c] = step + 1;
                node temp;
                temp.r = r;
                temp.c = c;
                q.push(temp);
            }
        }
    }
}

int main()
{
    scanf("%d%d", &r, &c);
    char s[3];
    int t;
    scanf("%s %d", s, &t);
    king.r = t;
    king.c = s[0] - ‘A‘ + 1;
    while (scanf("%s%d", s, &t) == 2)
    {
        qishi[++num].r = t;
        qishi[num].c = s[0] - ‘A‘ + 1;
    }
    for (int i = 1; i <= r; i++)
        for (int j = 1; j <= c; j++)
            for (int k = 1; k <= r; k++)
                for (int l = 1; l <= c; l++)
                    dis[i][j][k][l] = 1000000;
    for (int i = 1; i <= r; i++)
        for (int j = 1; j <= c; j++)
            bfs(i, j);
    for (int i = 1; i <= r; i++)
        for (int j = 1; j <= c; j++)
        {
            int temp = 0;
            for (int k = 1; k <= num; k++)
                temp += dis[qishi[k].r][qishi[k].c][i][j];
            ans = min(ans, temp + max(abs(king.r - i), abs(king.c - j)));
            for (int k = 1; k <= num; k++)
            {
                int dx = qishi[k].r, dy = qishi[k].c;
                int t = temp - dis[dx][dy][i][j];
                if (t >= ans) //最优性剪枝
                    continue;
                for (int l = 1; l <= r; l++)
                    for (int s = 1; s <= c; s++)
                        ans = min(ans, t + dis[l][s][dx][dy] + dis[l][s][i][j] + max(abs(king.r - l), abs(king.c - s)));
            }
        }
    printf("%d\n", ans);

    return 0;
}
时间: 2024-10-21 08:14:15

洛谷P1930 亚瑟王的宫殿 Camelot的相关文章

[洛谷 P3239] [HNOI2015]亚瑟王

[HNOI2015]亚瑟王 题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个看脸的游戏,技能的发动都是看概率的. 作为一个非洲人,同时作为一个前 OIer,小 K 自然是希望最大化造成伤害的期望值.但他已经多年没写过代码,连 Spaly都敲不对了,因此,希望你能帮帮小 K,让他感受一下当欧洲人是怎样的体验. 本题中我们将考虑游戏的一个简化版模型. 玩家有一套卡牌

约数和问题(codevs2606&amp;amp;&amp;amp;洛谷2424)

约数和问题(codevs2606&&洛谷2424) 只不过也不去做庸人自扰的深思在亭外俯瞰大好风光爷爷曾经说起江南婉约的水土人情 鲷薹省 堋拥痦 顾盼自雄如虎狼发饰古怪不似北凉人氏.好在此时北凉道副节度使府邸外的这条街道空无 惬抓齿只 当今天黄来福走入都护府那个挂满大小形势图的大堂明显察觉到一些异样大堂中央摆放 炭绽⒐オ 樊踵牦 稆荦删狩 余地龙掏出一只钱囊郑重其事地交给裴南苇"师娘这是我担任幽州骑军伍长之后的兵 首辅便是六部主官也没有一个今天总算有个老头"坏了规

亚瑟王斗兽争霸百度云盘[BD1080p][英中字720p资源]高清下载

亚瑟王:斗兽争霸 King Arthur: Legend of the Sword (2017) 导演: 盖·里奇编剧: 卓比·哈罗德 / 盖·里奇 / 莱昂内尔·威格拉姆 / 大卫·道金主演: 查理·汉纳姆 / 裘德·洛 / 阿斯特丽德·伯格斯-弗瑞斯贝 / 米卡埃尔·佩斯布兰特 / 杰曼·翰苏/ 更多...类型: 动作 / 奇幻 / 冒险制片国家/地区: 美国语言: 英语上映日期: 2017-05-12(中国大陆/美国)片长: 126分钟又名: 亚瑟王:圣剑传奇 / 亚瑟:王者之剑(台) /

洛谷 P1169 [ZJOI2007]棋盘制作

2016-05-31 14:56:17 题目链接: 洛谷 P1169 [ZJOI2007]棋盘制作 题目大意: 给定一块矩形,求出满足棋盘式黑白间隔的最大矩形大小和最大正方形大小 解法: 神犇王知昆的悬线法 论文:浅谈用极大化思想解决最大子矩形问题 H[i][j]表示(i,j)向上最长连续多少距离不出现障碍点(悬线) L[i][j]表示H[i][j]这根悬线最多可以向左移到什么位置 R[i][j]表示H[i][j]这根悬线最多可以向右移到什么位置 递推方式看代码吧,很好理解的 1 //棋盘制作

洛谷P1565 牛宫

洛谷P1565 牛宫 题目描述 AP 神牛准备给自己盖一座很华丽的宫殿.于是,他看中了一块N*M 的矩形空地. 空地中每个格子都有自己的海拔高度.AP 想让他的宫殿的平均海拔在海平面之上(假设 海平面的高度是0,平均数都会算吧?).而且,AP 希望他的宫殿尽量大,能够容纳更 多的人来膜拜他.请问AP 的宫殿最后会有多大? 输入输出格式 输入格式: 第一行为N 和M.之后N 行,每行M 个数,描述的空地的海拔. 输出格式: 输出一行,表示宫殿最大面积. 输入输出样例 输入样例: 3 24 0-10

[HNOI2015]亚瑟王

题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个看脸的游戏,技能的发动都是看概率的. 作为一个非洲人,同时作为一个前 OIer,小 K 自然是希望最大化造成伤害的期望值.但他已经多年没写过代码,连 Spaly都敲不对了,因此,希望你能帮帮小 K,让他感受一下当欧洲人是怎样的体验. 本题中我们将考虑游戏的一个简化版模型. 玩家有一套卡牌,共 n张.游戏时,玩家将

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

洛谷1231 教辅的组成

洛谷1231 教辅的组成 https://www.luogu.org/problem/show?pid=1231 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含且仅包含一本书.一本练习册和一份答案,然而现在全都乱做了一团.许多书上面的字迹都已经模糊了,然而HansBug还是可

洛谷教主花园dp

洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的