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;
}


华大HC32F460 TCP Server实验 阅读详情

相关推荐

PaddleOCR 与 PaddleX 调试

本文介绍了PaddleOCR与PaddleX的安装调试过程及应用对比。首先详细说明了环境准备步骤,包括安装ccache、设置环境变量及创建conda虚拟环境,提供了精简安装和源码安装两种方式。接着展示了使用PaddleOCR进行发票和手写汉字识别的测试结果,指出部分手写识别存在误差。随后对比了两者的差异:PaddleOCR专注于OCR算法优化,PaddleX则提供全流程工具链和标准化部署方案。最后演示了如何通过PaddleX部署OCR服务,包括API启动方法和客户端调用示例,为开发者提供了两种不同场景下的O

weixin_42176639的博客 1452

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

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

Hello,I'm Proking. 1095

ROS中costmap_converter插件的配置与使用

在学习TEB算法的过程中,作者提供了一个插件用于转换代价地图,原始的代价地图是由栅格地图中单元格组成,用于表示障碍物,但单元格占用的计算资源较大,故采用插件将单元格转换成点,线,多边形表示。 插件激活 rospack plugins --attrib=plugin costmap_converter 配置cfg文件 在导航配置文件下,新建costmap_converter_params.yaml #######################################################

weixin_42621524的博客 5904

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

卡尔曼滤波算法-Kalman Filter Algorithm

Kalman滤波是一种递归过程,主要有两个更新过程:时间更新和观测更新,其中时间更新主要包括状态预测和协方差预测,主要是对系统的预测,而观测更新主要包括计算卡尔曼增益、状态更新和协方差更新,因此整个递归过程主要包括五个方面的计算:1)状态预测;2)协方差预测;3)卡尔曼增益;4)状态更新;5)协方差更新; 用数学公式表示,如下: 状态预测:(1) 其中,X(k|k)是k时...

sunlin972913894的博客 2万+

C#连接数据库报Authentication to host ‘127.0.0.1‘ for user ‘root‘ using method ‘caching_sha2_password‘ fail

所以导致的,除了上边的办法,还可以把这个加密规则修改一下,这个的修改方式有很多,具体原因是因为MySQL8.0以前的加密规则是。

weixin_42209881的博客 4128

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

AR-HMM模型 自回归隐马尔可夫模型

AR-HMM模型 自回归隐马尔可夫模型 数据处理过程 输入的视频数据首先需要被裁剪以适合动物的大小,在这之后考虑到模型建立的目的为行为状态的分类,于是需要消除可能一帧里带有多个动作状态的行为成分,这个过程也就是对帧。对帧之后我们的为了适应模型训练还需要对每一帧的数据进行小波分解(类似傅里叶变换的信号重构),此时数据预处理阶段完成。 信号重构后的数据拥有的特征维度过多,因此需要应用主成分分析法(PCA)来选出对于分类结果贡献度最高的前十个分类特征。至此自回归隐马尔可夫模型的准备工作就完成了。 AR-HMM自

weixin_46263718的博客 2282

【USACO3.3.3】亚瑟王的宫殿

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

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

从零搭建 SAP ALE/IDoc:自定义 IDoc 结构、Outbound 发送、Inbound 入库与排错全流程

本文介绍了SAP系统中ALE和IDoc技术的应用,用于解决分布式系统集成中的数据传递问题。主要内容包括: ALE/IDoc技术概述 ALE通过消息驱动方式实现业务数据传递 IDoc作为标准化数据信封,包含控制信息、业务数据和状态记录 支持SAP与非SAP系统间集成 核心概念 ALE的价值在于业务消息传递而非远程调用 IDoc由控制记录、数据记录和状态记录三部分组成 WE60工具用于查看IDoc文档结构 实践案例 演示如何将自定义业务表数据打包为IDoc 详细说明IDoc结构定义步骤(段、基本类型、消息类型)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 318

[HQChart教程] 去掉“仅学习使用”文字提示的小技巧

最近用 HQChart 做图表时,发现左下角有“仅学习使用”的字样。这种水印虽然是默认的,但如果要展示给客户,可能会显得不够专业。还好,这个问题很好解决,只需要简单修改一下配置。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 598

[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

Autodesk Revit软件二次开发:Revit二次开发中的插件设计与实现

在 Revit 中,族是构成建筑模型的基本单元,可以是门窗、家具等。通过自定义族,可以创建符合特定需求的建筑构件。参数化设计允许族的尺寸、形状等属性根据参数变化而变化。使用 Revit API 创建自定义族涉及多个步骤,包括定义族类型、设置参数、创建几何形状等。// 创建族文档// 定义参数Parameter param = family.FamilyManager.AddParameter("Width", BuiltInParameterGroup.PG_LENGTH, "宽度");

kkchenjj的博客 2230

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

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

初学者 2071

VC中sqlite的使用

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

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

USACO 3.3.3 Camelot解题报告

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

diekang6987的博客 182

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

[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、付费专栏及课程。

余额充值