usaco3.3.3 Camelot

USACO 3.3.3 camelot解题思路及C++代码 @USACO 3.3.3 camelot USACO 3.3.3 camelot解题思路及C++代码 USACO 3.3.3 camelotUSACO 3.3.3 camelot解题思路及C++代码解题算法思路:源代码测试结果测试数据 几个世纪前,亚瑟王和圆桌骑士过去每年在元旦见面,以庆祝他们的团聚。为了纪念这些事件,我们考虑一个棋手游戏,一个棋子国王和几个骑士棋子放在一个方格内,而没有两个骑士会... 阅读详情

一 原题

Camelot
IOI 98

Centuries ago, King Arthur and the Knights of the Round Table used to meet every year on New Year's Day to celebrate their fellowship. In remembrance of these events, we consider a board game for one player, on which one chesspiece king and several knight pieces are placed on squares, no two knights on the same square.

This example board is the standard 8x8 array of squares:

The King can move to any adjacent square from  to  as long as it does not fall off the board:

A Knight can jump from  to , as long as it does not fall off the board:

During the play, the player can place more than one piece in the same square. The board squares are assumed big enough so that a piece is never an obstacle for any other piece to move freely.

The player's goal is to move the pieces so as to gather them all in the same square - in the minimal number of moves. To achieve this, he must move the pieces as prescribed above. Additionally, whenever the king and one or more knights are placed in the same square, the player may choose to move the king and one of the knights together from that point on, as a single knight, up to the final gathering point. Moving the knight together with the king counts as a single move.

Write a program to compute the minimum number of moves the player must perform to produce the gathering. The pieces can gather on any square, of course.

PROGRAM NAME: camelot

INPUT FORMAT

Line 1:Two space-separated integers: R,C, the number of rows and columns on the board. There will be no more than 26 columns and no more than 30 rows.
Line 2..end:The input file contains a sequence of space-separated letter/digit pairs, 1 or more per line. The first pair represents the board position of the king; subsequent pairs represent positions of knights. There might be 0 knights or the knights might fill the board. Rows are numbered starting at 1; columns are specified as upper case characters starting with `A'.

SAMPLE INPUT (file camelot.in)

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

The king is positioned at D4. There are four knights, positioned at A3, A8, H1, and H8.

OUTPUT FORMAT

A single line with the number of moves to aggregate the pieces.

SAMPLE OUTPUT (file camelot.out)

10

SAMPLE OUTPUT ELABORATION

They gather at B5. 
Knight 1: A3 - B5 (1 move) 
Knight 2: A8 - C7 - B5 (2 moves) 
Knight 3: H1 - G3 - F5 - D4 (picking up king) - B5 (4 moves) 
Knight 4: H8 - F7 - D6 - B5 (3 moves) 
1 + 2 + 4 + 3 = 10 moves. 


二 分析

棋盘(最大20*26)上有若干骑士和一个国王,骑士可以走“日”字,国王只能走单格的对角线。当一个骑士和国王汇集在同一位置时,骑士可以“带”着国王移动(即国王和骑士同时走“日”字,只算走了一步)。问把棋盘上所有棋子汇聚到同一位置最少需要多少步。

国王走得慢,直觉上国王不应该走太多步。因此我枚举了国王最多走2步的所有情况(正确性也不能保证),国王移动完后等待某个骑士过来将其送至目标点。棋盘上任意两点的距离用BFS算一下就好了。


三 代码

运行结果:

USER: Qi Shen [maxkibb3]
TASK: camelot
LANG: C++

Compiling...
Compile: OK

Executing...
   Test 1: TEST OK [0.000 secs, 4192 KB]
   Test 2: TEST OK [0.000 secs, 4200 KB]
   Test 3: TEST OK [0.000 secs, 4200 KB]
   Test 4: TEST OK [0.011 secs, 4204 KB]
   Test 5: TEST OK [0.086 secs, 4212 KB]
   Test 6: TEST OK [0.119 secs, 4212 KB]
   Test 7: TEST OK [0.000 secs, 4192 KB]
   Test 8: TEST OK [0.000 secs, 4204 KB]
   Test 9: TEST OK [0.054 secs, 4208 KB]
   Test 10: TEST OK [0.173 secs, 4468 KB]
   Test 11: TEST OK [0.000 secs, 4324 KB]
   Test 12: TEST OK [0.000 secs, 4200 KB]
   Test 13: TEST OK [0.000 secs, 4224 KB]
   Test 14: TEST OK [0.000 secs, 4204 KB]
   Test 15: TEST OK [0.000 secs, 4200 KB]
   Test 16: TEST OK [0.000 secs, 4200 KB]
   Test 17: TEST OK [0.000 secs, 4200 KB]
   Test 18: TEST OK [0.000 secs, 4192 KB]
   Test 19: TEST OK [0.000 secs, 4208 KB]
   Test 20: TEST OK [0.000 secs, 4224 KB]

All tests OK.

Your program ('camelot') produced all correct answers! This is your submission #4 for this problem. Congratulations!


AC代码(略丑):

/*
ID:maxkibb3
LANG:C++
PROB:camelot
*/

#include<cstdio>
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;

const int MAXR = 35;
const int MAXC = 30;
int dx[8][2] = {{-2, -1}, {-2, 1}, {-1, -2}, {-1, 2},
                {1, -2}, {1, 2}, {2, -1}, {2, 1}};
int bias[25][2] = {{-2, -2}, {-2, -1}, {-2, 0}, {-2, 1}, {-2, 2},
                   {-1, -2}, {-1, -1}, {-1, 0}, {-1, 1}, {-1, 2},
                   {0, -2}, {0, -1}, {0, 0}, {0, 1}, {0, 2},
                   {1, -2}, {1, -1}, {1, 0}, {1, 1}, {1, 2},
                   {2, -2}, {2, -1}, {2, 0}, {2, 1}, {2, 2}};

int R, C;
int king_r, king_c;
vector<int> knight_r;
vector<int> knight_c;
vector<int> pick_r;
vector<int> pick_c;
int vis[MAXR][MAXC];
int ans = 0x7fffffff;

int _abs(int num) {
    if(num < 0) return -num;
    else return num;
}

struct Node {
    int r, c, depth;
};

Node node(int _r, int _c, int _depth) {
    Node ret;
    ret.r = _r;
    ret.c = _c;
    ret.depth = _depth;
    return ret;
}

struct Dis {
    int d[MAXR][MAXC];
};
vector<Dis> knight_dis;
vector<Dis> pick_dis;

Dis dis(int _d[MAXR][MAXC]) {
    Dis ret;
    memcpy(ret.d, _d, sizeof(ret.d));
    return ret;
}

void init() {
    ifstream fin;
    fin.open("camelot.in");
    int r;
    char c;
    fin >> R >> C >> c >> r;
    king_r = r; king_c = c - 'A' + 1;
    while(fin >> c >> r) {
        knight_r.push_back(r);
        knight_c.push_back(c - 'A' + 1);
    }
}

bool valid(int _r, int _c) {
    if(_r < 1 || _r > R || _c < 1 || _c > C) return false;
    else return true;
}

void bfs(int _r, int _c) {
    queue<Node> q;
    q.push(node(_r, _c, 0));
    vis[_r][_c] = 0;
    while(!q.empty()) {
        Node head = q.front();
        q.pop();
        for(int i = 0; i < 8; i++) {
            int nr = head.r + dx[i][0];
            int nc = head.c + dx[i][1];
            if(!valid(nr, nc) || vis[nr][nc] != -1) continue;
            vis[nr][nc] = head.depth + 1;
            q.push(node(nr, nc, head.depth + 1));
        }
    }
}

void solve() {
    int knight_num = knight_c.size();
    for(int i = 0; i < knight_num; i++) {
        memset(vis, -1, sizeof(vis));
        bfs(knight_r[i], knight_c[i]);
        knight_dis.push_back(dis(vis));
    }
    for(int i = 0; i < 25; i++) {
        memset(vis, -1, sizeof(vis));
        int nr = king_r + bias[i][0], nc = king_c + bias[i][1];
        if(!valid(nr, nc)) continue;
        bfs(nr, nc);
        pick_dis.push_back(dis(vis));
        pick_r.push_back(bias[i][0]);
        pick_c.push_back(bias[i][1]);
    }
    for(int i = 1; i <= R; i++) {
        for(int j = 1; j <= C; j++) {
            int _ans = 0, _anscopy;
            if(knight_num == 0) {
                _ans = max(abs(R - king_r), abs(C - king_c));
                if(_ans < ans) ans = _ans;
                continue;
            }
            for(int k = 0; k < knight_num; k++) {
                _ans += knight_dis[k].d[i][j];
            }
            _anscopy = _ans;
            for(int k = 0; k < knight_num; k++) {
                _ans -= knight_dis[k].d[i][j];
                for(int l = 0; l < pick_r.size(); l++) {
                    if(knight_dis[k].d[king_r + pick_r[l]][king_c + pick_c[l]] == -1) continue;
                    if(pick_dis[l].d[i][j] == -1) continue;
                    _ans += knight_dis[k].d[king_r + pick_r[l]][king_c + pick_c[l]] +
                            max(_abs(pick_r[l]), _abs(pick_c[l])) +
                            pick_dis[l].d[i][j];
                    if(_ans < ans) ans = _ans;
                    _ans = _anscopy - knight_dis[k].d[i][j];
                }
                _ans = _anscopy;
            }
        }
    }
    freopen("camelot.out", "w", stdout);
    printf("%d\n", ans);
}

int main() {
    init();
    solve();
    return 0;
}


华为OD统一考试 - 模拟消息队列(Java & Python& JS & C++ & C ) 让我们来模拟一个消息队列的运作,有一个发布者和若干消费者,发布者会在给定的时刻向消息队列发送消息, 阅读详情

相关推荐

Diebold-Mariano检验

给定两个预测的预测结果,我们希望比较他们的预测结果,以用于预测模型精度的比较。 Diebold-Mariano检验本质是一个t检验,用于检验替代预测的两个损失序列的平均值是否相等。即,它是一系列损失差的零均值的t检验。在存在自相关的情况下,它使用损失差分时间序列标准差的自相关一致性估计。 注意,在使用DM检验式时,假设损失序列是平稳的。 另外,DM检验在小样本数据时往往会拒绝零假设。对于小样本数据,推荐Harvey, Leybourne and Newbold (HLN)检验【1】; 参考文献 【1】htt

weixin_43948357的博客 6565

【USACO题库】3.3.3 Camelot亚瑟王的宫殿

亚瑟王的宫殿这一道题目其实是IOI 1998年的第4道题目,所以应该还是有一定难度的,凭借自己的实力做了出来,还是非常开心的,我的方法如下: 因为题目描述不清楚,我看了两个译文,一个说国王必须和骑士共搭,一个说不一定要共搭,我想说其实这并没有什么问题,只要求最小值即可,这两种情况都需要考虑。 算法描述: 首先输入数据;这里是比较麻烦的,毕竟是字符串读入,占了大概20+行。 然后Bf

Hello,I'm Proking. 1095

基于Simulink的永磁同步电机(PMSM)无位置传感器矢量控制与龙伯格观测器设计​

本文介绍了基于Simulink的永磁同步电机(PMSM)无位置传感器矢量控制方法,重点讲解了龙伯格观测器的设计与实现。主要内容包括:1)系统架构与数学推导,通过静止坐标系状态方程和极点配置构建观测器;2)Simulink建模步骤,从电机模型搭建到观测器核心代码实现;3)仿真结果对比分析,显示龙伯格观测器相比滑模观测器具有更好的平滑性和抗噪能力;4)工程部署建议,包括参数在线辨识、低速补偿策略和代码生成优化。该方法实现了全速域无感运行,稳态转速误差小于1%,为低成本高可靠性电机控制提供了有效解决方案。

amy_mhd的博客 161

C++——【USACO 3.3.3】——Camelot

Camelot IOI 98 Centuries ago, King Arthur and the Knights of the Round Table used to meet every year on New Year's Day to celebrate their fellowship. In remembrance of these events, we consider a

McDonnell_Douglas的博客 671

从量子兔AlphaPi硬件拆解到ESP32-C3库开发实战

本文详细拆解了量子兔AlphaPi开发板的硬件构成,重点分析了其核心ESP32-C3芯片及外围传感器。通过逆向工程揭示了GPIO引脚定义与通信协议,并实战演示了如何从零开发MicroPython库,驱动按键、加速度计及LED点阵,最终整合成一个互动平衡球游戏项目,展现了开源硬件在教育与二次开发中的潜力。

weixin_29164497的博客 459

告别云端推理!用llama.cpp+树莓派5搭建本地AI问答机器人(完整配置流程)

本文详细介绍了如何在树莓派5上利用llama.cpp部署本地AI问答机器人,实现完全离线的智能对话。通过模型量化与格式转换技术,成功将MiniCPM-2B等大模型压缩并运行于资源受限的边缘设备,解决了隐私、延迟和成本问题,为物联网和硬件开发者提供了完整的配置流程与实践指南。

t1u2v的博客 507

USACO3.3.3 Camelot (camelot)

先将坐标离散化。 每个点向此处有骑士能走到的8个点连边。 然后以每个骑士为源点spfa,只不过记录距离时每个点要拆成两个点,接国王和不接国王。 dist[i][j][k]:以第i个骑士(离散化后的坐标)为源点,到第点j(离散化后的坐标),k=0不接,k=1接国王的最短路。 扩展的时候,dist[i][j][stat]扩展到dist[i][next_j][stat],然后还需判断,若stat

Shion的专栏 500

Windows环境下QGIS完整编译指南(从环境搭建到问题解决)

本文详细介绍了在Windows 11系统下编译QGIS 3.40.12版本的完整流程。主要内容包括:前期准备工作(系统要求、工具清单)、环境搭建(Visual Studio 2026、OSGeo4W、Qt Creator的安装配置)、以及详细的CMake参数设置。特别强调了依赖管理的重要性,并提供了解决常见编译错误的方案。该指南适用于GIS二次开发、QGIS功能定制和源码学习等场景,通过OSGeo4W工具简化了复杂的依赖管理过程,确保编译过程的可重复性。

LuckyHanMo的博客 1333

【USACO3.3.3】亚瑟王的宫殿

1、计算所有点,到所有点的最短路径。 (马步), 国王的步伐可以O(1)计算。   2、穷举国王要被“接”的位置。  PS:被接送的位置,和国王原来位置,距离不会差太远。 具体差多远…… 我没证明,我猜是3 3、穷举国王和骑士的会和地点 4、穷举所有的骑士,  骑士i来接送国王 5、特判:没有骑士来接送国王 注意:  1、RC分别为高和宽 2、可能会出现骑士无法到达汇合点的情

ACMer不要报考高校代码为13627的移通学院! 1042

倍福---EL2262模块飞拍配置

控制器安装了twincat3,用EL2262实现相机飞拍功能。本文档只介绍如何通过EL2262实现飞拍的触发,并不涉及视觉方面的处理 参考文章: https://author.baidu.com/home?from=bjh_article&app_id=1669190598708386 https://mp.weixin.qq.com/s/r4Iq8kOP-o4_M8vCce5M9g 1、 飞拍的应用 在大多数场合,只能当被检测工件和相机都处于静止状态下才能进行拍照,拍照完成后,再移动工件或相机,进

weixin_41883890的博客 3742

第1课:开篇扫盲——OpenClaw是什么?能帮你解决什么问题?(入门必看)

核心目标:学会安装、卸载、管理OpenClaw技能,自定义AI代理的性格与权限,让AI贴合自己的使用习惯。核心内容技能市场详解:ClawHub市场核心技能分类(办公、学习、开发、生活),热门技能推荐(web-search、文件处理、邮件管理)[superscript:3][superscript:4]。技能安装与卸载:终端命令实操(openclaw skill install/uninstall),技能更新与版本管理[superscript:3]。

从零开始,掌握网络安全。提供全面的网络安全教程、攻防演练技巧和行业动态。 1754

[USACO3.3.3]Camelot

转载请说明出处 Camelot IOI 98 Centuries ago, King Arthur and the Knights of the Round Table used to meet every year on New Year's Day to celebrate their fellowship. In remembrance of these events, we co

qq_37665716的博客 472

Windows10环境下激活虚拟环境报错【source : 无法将“source”项识别为 cmdlet、函数、脚本文件或可运行程序的名称】

在使用Django创建Web程序前,需要创建一个虚拟的工作环境,在使用【source ll_env/bin/activate】命令激活虚拟环境时报错:source : 无法将“source”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。所在位置 行:1 字符: 2。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1万+

USACO Training 3.3.3 Camelot 亚瑟王的宫殿 题解与分析

Camelot亚瑟王的宫殿 IOI 98 描述 很久以前,亚瑟王和他的骑士习惯每年元旦去庆祝他们的友谊。为了纪念上述事件,我们把这些是看作是一个有一人玩的棋盘游戏。有一个国王和若干个骑士被放置在一个由许多方格组成的棋盘上,没有两个骑士在同一个方格内。 这个例子是标准的8*8棋盘 国王可以移动到任何一个相邻的方格,从下图中

初学者 2071

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

USACO 3.3.3 Camelot解题报告

这题本来是个很水的题,但是USACO的特点大家是知道的:细节折磨死你……这题也不例外,好想其实也挺好写。但是如果不是一把成就会很悲剧……还好我是幸运的,基本一会就过了…… 但是这个题还是碰到了相当的问题,就是说pascal当中有我们无敌的神器fillword和filldword。但是C++当中只有一个fill,这个东西还要算指针头和指针尾,着实很悲剧。所以逼得我不得不用memset,很...

diekang6987的博客 182

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

USACO 3.3 Camelot (camelot)

/* Main Idea; dist[x1][y1][x2][y2] denote the knight's min move from (x1,y1) to (x2,y2); king_move_num[x][y] denote the king's min move from its initial place to the square it meet a knight.We can co

Hello World! 1767

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

[USACO3.3.3]camelot

  题目传送门:http://www.nocow.cn/index.php/Translate:USACO/camelot   这道题让我心痛,一开始写写不出,后来拖了很久,决定去看题解,没想到又看不懂官方题解,唉!后来看了下面的题解做了出来。题解的话,大概就是先预处理每个格子到另外格子的位置,再枚举在王的坐标+-2位置接王,枚举所有棋子的集中点加起来计算就好了。我的代码为了方便略粗鲁。   ...

weixin_30411997的博客 136

USACO 3.3 Camelot

题意: 在R行C列的棋盘上(R 骑士和王到达一个点的时候骑士可以接王。 问:最少经过多少步能够让所有的棋子到达同一格。 思路: 首先棋盘的每两点之间的骑士最短距离可以通过R*C次BFS得到。 考虑暴力枚举: for 集合点(R*C)      for 接王的骑士(R*C)           for 接王的点(R*C)                算出距离 这样,复杂度

jasison 571

3.3.3 Camelot亚瑟王的宫殿 USACO

题目描述 很久以前,亚瑟王和他的骑士习惯每年元旦去庆祝他们的友谊。在回忆中,我们把这些是看作是一个有一人玩的棋盘游戏。有一个国王和若干个骑士被放置在一个由许多方格组成的棋盘上,没有两个骑士在同一个方格内。 这个例子是标准的8*8棋盘 国王可以移动到任何一个相邻的方格,从到前提是他不掉出棋盘之外。 一个骑士可以从移动到但前提是他不掉出棋盘之外。 玩家的任务就是把所有的棋子移动到同一...

算法小猪的博客 522

USACO Training Section 3.3 Camelot

[url="http://ace.delos.com/usacoprob2?a=KxExhYBcUZv&S=camelot"]英文原题[/url] [url="http://www.wzoi.org/usaco/13%5C301.asp"]中文题译[/url] 大意:在棋盘上方若干个骑士和一个国王,要让他们汇聚到一个格子上,其中骑士带上国王走这样国王上马之后不计代价。问,汇集他们的...

山中竹笋 211

USACO 3.3.3 Camelot

这是传说中的镇站神题么.. orz了 前前后后大概写了30k的代码,调了10+h才过...如果一开始就想清楚,只要调好2个typo,几个特判就好了,不用2个小时,所以写之前一定要想清楚细节... 首先用个四维数组保存任意点到任意点的距离,然后穷举集结点计算普通的骑士距离和,同时找出最短的先去载王再到集结点的距离。 一个优化是假设王自己的移动范围只有+-2. 同时要注意没有骑士和有骑

lichwing的专栏 633

USACO 3.3.3 camelot

本来这是个简单题,但是两年前第一次做的时候发现它真的太经典了! 【camelot】/* ID: wangqia6 TASK: camelot LANG: C++ */ #include #include #include #inclu

inc(Arthur's fighting) 640

Usaco Training Section 3.3 Camelot

唉,我还是太菜了,一道最短路/搜索题搞了这么久,9次才过。 骑士能像马一样跳,国王能上下左右对角线走,还可以选一个骑士绑架国王(拖着国王走),问多少步所有人才能聚在一起。 一开始想到了(n*m)^4的做法,就是先从每个点跑个dij,再枚举绑架位置、绑架者、聚集地点、每个骑士。肯定超时。后来发现可以优化。我们在国王只能在一个很小的范围(+-2)活动,否则答案不是最优的。 贴上有点繁的代码(...

Monster的博客 344

USACO Section 3.3 Camelot

题意: 棋盘上有一些骑士和一个王  王在移动时与骑士相遇可以同行  问  最少多少步可以使骑士和王汇聚到一起 思路: 先假设棋盘上每个点都有个骑士  bfs得出任意两点的最短路  再枚举终点  分两种情况讨论: 1.王和骑士均自己走到终点 2.骑士去接王一起走 对于情况1直接计算即可  对于情况2需要枚举哪个骑士在哪个点接上王 但完全枚举数量太大需要剪枝——王最多移动两步

House 906

usaco3.3Camelot

题意:现在有一些马和一个国王,马走“日”字,国王可以走向邻近的八个位置,如果国王和马在同一个格子里,国王可以选择骑上马,跟马一起走。现求总的最少步数(国王骑在马上时,走一步只算做一步)使的所有马和国王汇合在一个格子中。         分析:如果没有国王的话,

qjklw 493
上一篇: usaco3.3.2 Shopping Offers
下一篇: usaco3.3.5 A Game
max_kibble
博客等级 码龄11年 2粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值