题目描述

很久以前,亚瑟王和他的骑士习惯每年元旦去庆祝他们的友谊。在回忆中,我们把这些是看作是一个有一人玩的棋盘游戏。有一个国王和若干个骑士被放置在一个由许多方格组成的棋盘上,没有两个骑士在同一个方格内。
这个例子是标准的8*8棋盘

国王可以移动到任何一个相邻的方格,从 到  前提是他不掉出棋盘之外。

一个骑士可以从   移动到 但前提是他不掉出棋盘之外。

玩家的任务就是把所有的棋子移动到同一个方格里——用最小的步数。为了完成这个任务,他必须按照上面所说的规则去移动棋子。玩家必须选择一个骑士跟国王一起行动,其他的单独骑士则自己一直走到集中点。骑士和国王一起走的时候,只算一个人走的步数。
写一个程序去计算他们集中在一起的最小步数,而且玩家必须自己找出这个集中点。当然,这些棋子可以在棋盘的任何地方集合。

输入

第一行: 两个用空格隔开的整数:R,C 分别为棋盘行和列的长。不超过26列,40行。
第二行..结尾: 输入文件包含了一些有空格隔开的字母/数字对,一行有一个或以上。第一对为国王的位置,接下来是骑士的位置。可能没有骑士,也可能整个棋盘都是骑士。行从1开始,列从大写字母A开始。

输出

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

样例输入

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

样例输出

10

提示

国王位置在D4。一共有四个骑士,位置分别是A3,A8,H1和H8
他们集中在B5。
骑士1: A3 - B5 (1步)
骑士2: A8 - C7 - B5 (2步)
骑士3: H1 - G3 - F5 - D4 (picking up king) - B5 (4步)
骑士4: H8 - F7 - D6 - B5 (3步)
1 + 2 + 4 + 3 = 10步.

题解:

这题看上去好像毫无头绪,因为我们要让骑士和国王两不误,才是最优解

为了从简单入手,先依次枚举汇合点,用bfs得出骑士在棋盘上每个能跳到的点还需几步才能到达终点并且标记棋盘上所有的骑士能到的点。

好,现在我们考虑国王。

可以发现对于每一个汇合点,让国王跑一遍bfs,离骑士点最短距离disk[x][y]再加上该点的骑士到达终点的路程dis[x][y]就是此汇集点的最优解,再枚举每一个汇集点,取最优就ok了。

代码:

#include<bits/stdc++.h>
using namespace std;
struct node
{int x,y;
}tmp;
int n,m,kn=0,ans=1<<29;
int kx,ky,knight[1020][3],dis[50][50],vis[50][50];
int dist[50][50],cnt=0;
char c[5];int dir_qi[3][9]={{0,0,0,0,0,0,0,0,0},{0,-2,-2,-1,-1,1,1,2,2},{0,-1,1,-2,2,-2,2,1,-1}};
int dir_guo[3][9]={{0,0,0,0,0,0,0,0,0},{0,-1,-1,-1,0,0,1,1,1},{0,-1,1,0,1,-1,-1,1,0}};
int judge_q(int x,int y)
{if(x>n || x<1 || y>m || y<1) return 0;if(dis[x][y]!=-1) return 0; return 1;
}
int judge_r(int x,int y)
{if(x>n || x<1 || y>m || y<1) return 0;if(vis[x][y]) return 0; return 1;
}
int judge_k(int x,int y)
{if(x>n || x<1 || y>m || y<1) return 0;if(dist[x][y]!=-1) return 0;return 1;
}
int bfs_king()
{int rec=1<<29;queue<node> q;q.push((node){kx,ky});memset(dist,-1,sizeof(dist));dist[kx][ky]=0;while(!q.empty()){node temp;temp=q.front();q.pop();int xx=temp.x;int yy=temp.y;if(vis[xx][yy]) rec=min(dist[xx][yy],rec);for(int i=1;i<=8;i++){int a=xx,b=yy;a=xx+dir_guo[1][i];b=yy+dir_guo[2][i];if(!judge_k(a,b)) continue;dist[a][b]=dist[xx][yy]+1;if(vis[a][b]) rec=min(dist[a][b],rec);else q.push((node){a,b}); }}return rec;
}
void Mark(int x,int y)
{int xx=x,yy=y;for(int i=1;i<=8;i++){xx=x+dir_qi[1][i];yy=y+dir_qi[2][i];if(dis[xx][yy]==dis[x][y]-1 && judge_r(xx,yy)){vis[xx][yy]=1;Mark(xx,yy);}}
}
int bfs_knight(int x,int y)
{memset(vis,0,sizeof(vis));queue<node> q;vis[x][y]=1;dis[x][y]=0;q.push((node){x,y});while(!q.empty()){node temp;temp=q.front();int xx=temp.x;int yy=temp.y;q.pop();for(int i=1;i<=8;i++){int u,v;u=xx+dir_qi[1][i];v=yy+dir_qi[2][i];if(!judge_q(u,v))continue;dis[u][v]=dis[xx][yy]+1;q.push((node){u,v});}}int rec=0;for(int i=1;i<=kn;i++){if(dis[knight[i][1]][knight[i][2]]<0)return 1e8;rec+=dis[knight[i][1]][knight[i][2]];if(rec>=ans) return rec;vis[knight[i][1]][knight[i][2]]=1;Mark(knight[i][1],knight[i][2]);}int a1=bfs_king();rec+=a1;return rec;
}
int main()
{scanf("%d%d",&n,&m);cin>>c;cin>>kx;ky=c[0]-'A'+1;while(~scanf("%s%d",c,&knight[++kn][1])){knight[kn][2]=c[0]-'A'+1;}kn--;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){memset(dis,-1,sizeof(dis));int tt=bfs_knight(i,j);ans=min(ans,tt);}cout<<ans<<endl;return 0;
}

3.3.3 Camelot亚瑟王的宫殿 USACO相关推荐

  1. USACO Training3.3亚瑟王的宫殿【搜索】By cellur925

    题目传送门 因为太蒟了,所以参考了dalao@zbtrs ==    对此表示感谢并侵删. 看起来我们就知道这是搜索题. 最后的情况分两种:有骑士背国王/国王自食其力走到集合点. 首先,我们不知道大家 ...

  2. 乖离性暗机器人_《乖离性百万亚瑟王》国服超弩暗机器人平民通关攻略

    乖离性百万亚瑟王国服第一次迎来新的机器人类型BOSS,难度还是比较大的!在打暗机器人的时候有什么需要注意的细节,我们一起来看看吧! 首先介绍一下暗机器人的属性数据: 属性:暗系 接下来介绍一下BOSS ...

  3. SSD成就了《扩散性百万亚瑟王》

    盛大网络最近上线了一款手机游戏<扩散性百万亚瑟王>.游戏推出的当周,盛大的股票上涨了30%.这款一上线就受到广泛欢迎的游戏后端支持平台就采用了英特尔针对数据中心的DC系列S3700和S35 ...

  4. [HNOI2015]亚瑟王

    题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个看脸的游戏,技能 ...

  5. 亚瑟王(bzoj 4008)

    Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...

  6. 乖离性暗机器人_乖离性百万亚瑟王国服超弩暗机器人如何打|乖离性百万亚瑟王国服超弩暗机器人平民打法攻略分享_好特教程...

    <乖离性百万亚瑟王>国服近日迎来了新的机器人类型BOSS,难度不小,那么在打暗机器人的时候有什么需要注意的细节呢?下面我们就一起来看看吧. 首先介绍一下暗机器人的属性数据: 属性:暗系 接 ...

  7. [BZOJ4008]亚瑟王

    Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...

  8. 【BZOJ4008】【HNOI2015】亚瑟王 [期望DP]

    亚瑟王 Time Limit: 20 Sec  Memory Limit: 512 MB [Submit][Status][Discuss] Description 小 K 不慎被 LL 邪教洗脑了, ...

  9. BZOJ-4008: [HNOI2015]亚瑟王 (概率期望DP)

    4008: [HNOI2015]亚瑟王 Time Limit: 20 Sec  Memory Limit: 512 MBSec  Special Judge Submit: 1627  Solved: ...

  10. 唐 库利超级计算机,第七卷 乖离性 百万亚瑟王_第二百五十二章 绝望中的希望...

    第七卷 乖离性 百万亚瑟王_第二百五十二章 绝望中的希望 赫布里底训练大厅. "诸位,结果已经分析出来了,丘库林,也就是被你们捉到的闯入者,他身上的神装的确是断绝时代的遗物不错,而且,这件神 ...

最新文章

  1. C语言将数组中的值逆序存放
  2. C++设计模式——适配器模式(对象适配器、类适配器)
  3. 使用windbg排查一个内存溢出的问题
  4. vba 自动换行_Excel中quot;强制换行quot;quot;快速求和quot;等操作,这9个AlT键技巧全都包含了...
  5. plsql如何执行单个语句_在单个try-with-resources语句中仔细指定多个资源
  6. matlab 最小二乘法拟合_Scripy实现最小二乘法与股票K线回归
  7. Redis zset(ziplist,skiplist)内部实现
  8. python 字典查询比列表快_为什么python字典要比列表快以及哈希查找解释。
  9. 浣溪沙·江畔芦花【两首】
  10. [Java基础]StringUtils.join()方法与String.join()方法的使用
  11. java实验报告实验思路_20145307第一周JAVA实验报告
  12. CreateThread,_beginthread与AfxbeginThread之间的区别
  13. android xutils 教程,Android xUtils更新到3.0后的基本使用规则详解
  14. Android 获取应用信息—PackageManager
  15. vbnet 操作autoCAD之 给出矩形如何画内切椭圆
  16. inno setup 卸载注册表_Inno Setup Compiler卸载时删除注册表
  17. 北京邮电大学砸彩蛋大作业
  18. 神舟微型计算机系统重装步骤,电脑重装系统步骤,最简单安全的操作!
  19. debian7升级到debian9
  20. 使用Vivado软件进行硬件调试

热门文章

  1. 应用二 stm32使用esp8266进行串口wifi通信
  2. win下apache2.4 支持php8.0
  3. Maxima在线性代数的应用
  4. 佩服的一个阿里 P9 大佬,离职了...
  5. 计算机自杀式软件--USBKill
  6. 如何揪出修改浏览器主页的流氓软件1
  7. Direct Rendering Manager (DRM)
  8. OKR-Periods of Words
  9. android 热修复阿里,Android热修复(阿里热修复)
  10. ImageNet 1K 类别名与索引的对应关系