洛谷P1930 亚瑟王的宫殿 Camelot
P1930 亚瑟王的宫殿 Camelot
- 19通过
- 53提交
- 题目提供者JOHNKRAM
- 标签USACO
- 难度提高+/省选-
提交 讨论 题解
最新讨论
- 暂时没有讨论
题目描述
很久以前,亚瑟王和他的骑士习惯每年元旦去庆祝他们的友谊。为了纪念上述事件, 我们把这些故事看作是一个棋盘游戏。有一个国王和若干个骑士被放置在一个由许多方格 组成的棋盘上,没有两个骑士在同一个方格内。
这个例子是标准的 8*8 棋盘
国王可以移动到任何一个相邻的方格,从下图中黑子位置到下图中白子位置前提是他 不掉出棋盘之外。
一个骑士可以从下图中黑子位置移动到下图中白子位置(走“日”字形) 但前提是他 不掉出棋盘之外。
在游戏中,玩家可在每个方格上放不止一个棋子,假定方格足够大,任何棋子都不会 阻碍到其他棋子正常行动。
玩家的任务就是把所有的棋子移动到同一个方格里——用最小的步数。为了完成这个 任务,他必须按照上面所说的规则去移动棋子。另外,玩家可以选择一个骑士跟国王从他 们两个相遇的那个点开始一起行动,这时他们按照骑士的行动规则行动,其他的单独骑士 则自己一直走到集中点。骑士和国王一起走的时候,只算一个人走的步数。
请计算他们集中在一起的最小步数,而且玩家必须自己找出这个集中点。当然,这些 棋子可以在棋盘的任何地方集合。
输入输出格式
输入格式:
第一行: 两个用空格隔开的整数:R,C 分别为棋盘行和列的长。不超过 26 列,40 行。
第二行到结尾: 输入文件包含了一些有空格隔开的字母/数字对,一行有一个或以 上。第一对为国王的位置,接下来是骑士的位置。可能没有骑士,也可能整个棋盘都是骑 士。行从 1 开始,列从大写字母 A 开始。
输出格式:
单独一行表示棋子集中在一个方格的最小步数。
输入输出样例
8 8
D 4
A 3 A 8
H 1 H 8
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[][][][],num,ans = ; const int dr[] = { -,-,,,,,-,- };
const int dc[] = { ,,,,-,-,-,- }; struct node
{
int r, c;
}king,qishi[]; bool vis[][]; bool check(int x, int y)
{
if (x >= && x <= r && y >= && 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] = ;
vis[x][y] = true; while (!q.empty()) {
node u = q.front();
q.pop();
step = dis[x][y][u.r][u.c];
for (int i = ;i<;++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 + ;
node temp;
temp.r = r;
temp.c = c;
q.push(temp);
}
}
}
} int main()
{
scanf("%d%d", &r, &c);
char s[];
int t;
scanf("%s %d", s, &t);
king.r = t;
king.c = s[] - 'A' + ;
while (scanf("%s%d", s, &t) == )
{
qishi[++num].r = t;
qishi[num].c = s[] - 'A' + ;
}
for (int i = ; i <= r; i++)
for (int j = ; j <= c; j++)
for (int k = ; k <= r; k++)
for (int l = ; l <= c; l++)
dis[i][j][k][l] = ;
for (int i = ; i <= r; i++)
for (int j = ; j <= c; j++)
bfs(i, j);
for (int i = ; i <= r; i++)
for (int j = ; j <= c; j++)
{
int temp = ;
for (int k = ; 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 = ; 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 = ; l <= r; l++)
for (int s = ; 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 ;
}
洛谷P1930 亚瑟王的宫殿 Camelot的更多相关文章
- 洛谷 P1930 亚瑟王的宫殿 Camelot
传送门 题目大意:棋盘有骑士有王,让所有点跳到一个点,求所有棋子跳的步数和,和最小. 题解:bfs+枚举 王的人生: 1):自己走到聚集点 2):某个骑士来到王这里,两个棋子一起到聚集点 3):王走几 ...
- USACO Training3.3亚瑟王的宫殿【搜索】By cellur925
题目传送门 因为太蒟了,所以参考了dalao@zbtrs == 对此表示感谢并侵删. 看起来我们就知道这是搜索题. 最后的情况分两种:有骑士背国王/国王自食其力走到集合点. 首先,我们不知道大家 ...
- [洛谷 P3239] [HNOI2015]亚瑟王
[HNOI2015]亚瑟王 题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知, ...
- 洛谷 P3239 / loj 2112 [HNOI2015] 亚瑟王 题解【期望】【DP】
???看不懂的期望DP 题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚 ...
- 【洛谷3239_BZOJ4008】[HNOI2015] 亚瑟王(期望 DP)
题目: 洛谷 3239 分析: 卡牌造成的伤害是互相独立的,所以 \(ans=\sum f_i\cdot d_i\) ,其中 \(f_i\) 表示第 \(i\) 张牌 在整局游戏中 发动技能的概率.那 ...
- 洛谷P3239 [HNOI2015]亚瑟王
题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个看脸的游戏,技能 ...
- 【洛谷2403】[SDOI2010] 所驼门王的宝藏(Tarjan+dfs遍历)
点此看题面 大致题意: 一个由\(R*C\)间矩形宫室组成的宫殿中的\(N\)间宫室里埋藏着宝藏.由一间宫室到达另一间宫室只能通过传送门,且只有埋有宝藏的宫室才有传送门.传送门分为3种,分别可以到达同 ...
- 【BZOJ4008】[HNOI2015]亚瑟王(动态规划)
[BZOJ4008][HNOI2015]亚瑟王(动态规划) 题面 BZOJ 洛谷 题解 设\(f[i][j]\)表示前\(i\)张卡中有\(j\)张被触发的概率. 分两种情况转移,即当前这张是否被触发 ...
- 【BZOJ4008】[HNOI2015]亚瑟王
[BZOJ4008][HNOI2015]亚瑟王 题面 bzoj 洛谷 题解 由期望的线性性 可以知道,把所有牌打出的概率乘上它的伤害加起来就是答案 记第$i$张牌打出的概率为$fp[i]$ 则 $$ ...
随机推荐
- Oracle11g中Exp命令空表不能导出的问题
http://www.jb51.net/article/43894.htm 一.不能导出空表的原因 1.Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空 ...
- 从SVN导出指定版本号之间修改的文件
当一个网站项目进入运营维护阶段以后,不会再频繁地更新全部源文件到服务器,这个时间的修改大多是局部的,因此更新文件只需更新修改过的文件,其他 没有修改过的文件就没有必要上载到服务器.但一个稍微上规模的网 ...
- 深度优化LNMP
优化前准备工作 Centos准备及配置 准备安装包及软件:http://pan.baidu.com/s/1chHQF 下载解压到U盘即可安装http://pan.baidu.com/s/15TUWf ...
- 【wp之二 页面布局】
1. panoramic全景视图 新建工程选择:Windows Phone Panorama Application 相当于用放大镜看报纸的感觉.用一张图片作为背景. 2.pivot透视视图
- 黄聪:利用Aspose.Word控件实现Word文档的操作(转)
撰写人:伍华聪 http://www.iqidi.com Aspose系列的控件,功能都挺好,之前一直在我的Winform开发框架中用Aspose.Cell来做报表输出,可以实现多样化的报表设计及 ...
- TCP程序设计
在Java中使用Socket(套接字)完成TCP程序的开发,使用此类可以方便地建立可靠的.双向的.持续的.点对点的通信连接. 在Socket的程序开发中,服务器端使用ServerSoc ...
- HBASE解析
Hbase是运行在Hadoop上的NoSQL数据库,它是一个分布式的和可扩展的大数据仓库,也就是说HBase能够利用HDFS的分布式处理模式,并从Hadoop的MapReduce程序模型中获益.这意味 ...
- winform DataGridView控件判断滚动条是否滚动到当前已加载的数据行底部 z
http://www.zuowenjun.cn/post/2015/05/20/162.html 判断 DataGridView控件滚动条是否滚动到当前已加载的数据行底部,其实方法很简单,就是为Dat ...
- mac下Android开发环境搭建
之前一段时间在学习ios的开发,近一段时间想着也接触下Android开发,以来加深对移动端开发的理解.这里根据自己配置Android开发环境的过程,比较详细的来总结下自己的安装过程,希望对一些正准备配 ...
- git重写历史记录
1 修改上一次历史提交,替换掉上次的提交git commit --amend 2 git rebase 将不同分支路径合并到同一分支路径上eg:将master分支上的 conflic rebase合并 ...