题目背景
本测试数据为脚造,欢迎提供hack。
第18组数据卡了很多人,放于附件中供检查。

题目描述
时隔数年,刺客荆轲再次来到咸阳宫,试图刺杀嬴政。
咸阳宫的地图可以描述为一个 n 行 m 列的矩形。在这里,我们规定每一行中从左到右为 x 轴正方向,每一列中从下到上为 y 轴正方向,左下角的点坐标为 (1,1)。矩形中的点可以分为 4 种:
起点,也就是荆轲的所在点,在地图中用字符"S"代表。
终点,也就是嬴政的所在点,在地图中用字符"T"代表。
卫兵,在地图中用一个正整数 ai,j​ 代表。在这里,一个卫兵 (i,j)(i,j) 可以观察到与他曼哈顿距离小于 a_{i,j}ai,j​ 的点。也就是卫兵 (i,j) 可以观察到所有满足∣x−i∣+∣y−j∣<ai,j​ 的点 (x,y)。
空地,在地图中用字符"."代表。
荆轲的正常移动方式为每秒向八连通的任意方向前进一格。如下图,中间的点为荆轲当前所在点,每一秒,他可以走向其余的八个点。
需要注意的是,正常移动时,荆轲不能踏进任何一个有卫兵或者卫兵能观察到的格子。当然,他也不能走出咸阳宫,也就是说,无论何时,荆轲的坐标 (x,y) 都必须满足1≤x≤m 且 1≤y≤n。
荆轲还有两种技能:隐身和瞬移。
隐身:下一秒荆轲进入隐身状态,卫兵观察不到荆轲,荆轲可以进入卫兵的观察范围内,但仍然不能进入卫兵所在的格子。注意这个状态只能维持一秒。
瞬移:荆轲下一秒移动的距离改为 dd,但这时只能向上下左右四个方向移动。即可以移动到(x,d+y)(x,d+y),(x,d-y)(x,d−y)。
在本题中,两种技能可以同时使用,而且不考虑冷却时间,即一次用完可以立即用下一次,两种技能都分别有使用次数限制,你也可以不用完所有次数。
现在给出咸阳城的地图,请计算荆轲到达秦王所在点所需的最短时间。此外,在所用时间相同情况下,荆轲希望使用的两种技能总次数尽可能少;在所用时间与技能次数相同情况下,荆轲希望使用的隐身次数尽可能少。

输入格式
第一行五个整数n,m,c1​,c2​,d,代表地图的大小为n×m,隐身的使用限制次数为 c1​,瞬移的使用限制次数为c2​ 和一次瞬移的距离为 d。
接下来 n 行,每行 m 个元素。每个元素为字符"S"、“T”、"."或者一个正整数 ai,j​,代表一个格点,具体含义详见题目描述。

输出格式
若荆轲无法到达秦王所在点,则输出一行一个 -1。
否则输出一行三个整数 t,u1​,u2​,依次代表所需的最短时间,隐身的使用次数与瞬移的使用次数。

样例1 输入
5 4 0 0 5
. 1 T 1
. . . 2
. 1 . .
S . . .
1 . . .

样例1 输出
3 0 0

样例1 解释
起点为 (1,2),荆轲可以依次走到 (1,3),(2,4),(3,5) 到达终点。

样例2 输入
8 6 2 3 3
. S . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
2 . 2 . 2 .
. . 1 . T .
3 . 1 . . 3

样例2 输出
3 1 3

样例2 解释
起点为 (2,8),荆轲可以依次走到 (2,5),(2,2),(5,2),需要注意的是,即使最后一步到达终点,但因为终点在卫兵的观察范围之内,所以仍然需要隐身进入。

样例3 输入
8 6 5 5 2
. S . . . .
. . . . . .
. . . . . .
1 1 3 2 .
1 2 3 2 2
1 3 3 2 4
1 4 3 2 6
1 5 T 2 8
1 6 3 2 10

样例3 输出
-1

附件下载
bandit.zip

传送门

满分代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,c1,c2,d;
int sx,sy,tx,ty;
string s;
int a[351][351];
int zz[351][351];
bool flag[351][351][16][16];
void uw(int i,int j,int x) {for(int k=-x+1; k<=x-1; k++) {if(k+i<1||k+i>n)continue;int p=x-1-(k<0?-k:k);if(j-p<1)a[k+i][0]+=1;else a[k+i][j-p]+=1;if(j+p+1>m);else a[k+i][j+p+1]-=1;}
}
struct wu {int x,y,u1,u2,t;
};
int ans1=2000000,ans2=2000000,ans=2000000;
int X[8]= {0,0,1,-1,1,1,-1,-1};
int Y[8]= {1,-1,0,0,1,-1,1,-1};
void bfs() {queue<wu> q;q.push((wu) {sx,sy,0,0,0});flag[sx][sy][0][0]=1;while(!q.empty()) {wu x=q.front();q.pop();if(x.t>ans)continue;if(x.x==tx&&x.y==ty) {if(x.t<ans) {ans=x.t;ans1=x.u1;ans2=x.u2;} else {if(ans1+ans2>x.u1+x.u2) {ans=x.t;ans1=x.u1;ans2=x.u2;} else if(ans1+ans2==x.u1+x.u2&&ans1>x.u1) {ans=x.t;ans1=x.u1;ans2=x.u2;}}continue;}for(int i=0; i<8; i++) {int xx=x.x+X[i],yy=x.y+Y[i];if(xx<1||xx>n||yy<1||yy>m)continue;if(zz[xx][yy]==1)continue;if(a[xx][yy]<=0&&flag[xx][yy][x.u1][x.u2]==0) {flag[xx][yy][x.u1][x.u2]=1;q.push((wu) {xx,yy,x.u1,x.u2,x.t+1});} else if(x.u1+1<=c1&&flag[xx][yy][x.u1+1][x.u2]==0) {flag[xx][yy][x.u1+1][x.u2]=1;q.push((wu) {xx,yy,x.u1+1,x.u2,x.t+1});}}if(x.u2+1>c2)continue;for(int i=0; i<4; i++) {int xx=x.x+X[i]*d,yy=x.y+Y[i]*d;if(xx<1||xx>n||yy<1||yy>m)continue;if(zz[xx][yy]==1)continue;if(a[xx][yy]<=0&&flag[xx][yy][x.u1][x.u2+1]==0) {flag[xx][yy][x.u1][x.u2+1]=1;q.push((wu) {xx,yy,x.u1,x.u2+1,x.t+1});} else if(x.u1<c1&&flag[xx][yy][x.u1+1][x.u2+1]==0) {flag[xx][yy][x.u1+1][x.u2+1]=1;q.push((wu) {xx,yy,x.u1+1,x.u2+1,x.t+1});}}}
}
int main() {scanf("%d%d%d%d%d",&n,&m,&c1,&c2,&d);for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++) {cin>>s;if(s=="S")zz[i][j]=-2,sx=i,sy=j;else if(s=="T")zz[i][j]=-1,tx=i,ty=j;else if(s==".");else {zz[i][j]=1;int x=s[0]-'0';for(int i=1; i<s.length(); i++)x=x*10+s[i]-'0';uw(i,j,x);}}}for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++) {a[i][j]+=a[i][j-1];}}bfs();if(ans==2000000)printf("-1");else printf("%d %d %d",ans,ans1,ans2);return 0;
}

洛谷6474[NOI Online #2 入门组]荆轲刺秦王相关推荐

  1. P6474 [NOI Online #2 入门组] 荆轲刺秦王 题解--zhengjun

    我一开始就打出来了,可是忘记一个很重要的剪枝,就是如果当前的步数已经超过答案的步数就不用搜了,还有就是每一个点的每一种状态都只能走到一次(其实就是走到一个点,之前使用了相同的魔法已经到过这个点)那么也 ...

  2. 【寒假每日一题】洛谷 P7471 [NOI Online 2021 入门组] 切蛋糕

    题目链接:P7471 [NOI Online 2021 入门组] 切蛋糕 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 Alice.Bob 和 Cindy 三个好朋友得到 ...

  3. 【DFS】洛谷P6566 [NOI Online #3 入门组]观星(民间数据)

    Link Problem Sample-1 in 5 7 *...... ..**..* .*...*. ...*... ....*.. Sample-1 out 3 4 Sample-2 in 10 ...

  4. NOI Online #2 普及组 第二题:荆轲刺秦王

    NOI Online #2 普及组 第二题:荆轲刺秦王 前言 题目 解析 完整代码 前言 做题之前,让我们大吼几声: 你 这 个 " 良 心 " 出 题 人 ! \bold{\so ...

  5. 洛谷P6474荆轲刺秦王

    传送门 upd on 2022.8.17:时隔半年复盘,把标记改成了差分写法,使用了STL队列,进行了码风优化.(为什么当年博客风格如此智障/kk 谁能拒绝一只拥有无CD闪现和大招的荆轲呢. 小明首先 ...

  6. 洛谷oj题单【入门2】分支结构-入门难度(Java)

    洛谷oj题单[入门2]分支结构-入门难度(Java) 来源:https://www.luogu.com.cn/training/101#problems P5709 [深基2.习6]Apples Pr ...

  7. 洛谷P1003 铺地毯 noip2011提高组day1T1

    洛谷P1003 铺地毯 noip2011提高组day1T1 洛谷原题 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n ...

  8. #洛谷oj:P1525 [NOIP2010 提高组] 关押罪犯

    洛谷oj:P1525 [NOIP2010 提高组] 关押罪犯 #题目描述 #一看很明显是贪心算法 加排序 因为 这个中间最大值的那一对肯定是不会在一起的 从大到小来看 所有点对都尽量不要在一个监狱 # ...

  9. 洛谷题目按难度点评---入门难度

    洛谷题目按难度点评---入门难度 1.p1421 小玉买文具 难度:入门难度 考点:输入,输出,整数的四则运算 适用:小学生 #include <stdio.h> int main(){ ...

最新文章

  1. 2018android旗舰手机,2018 年发布的 Android 手机,哪一部是你心目中的最佳手机?理由是什么?...
  2. struct类型重定义 不同的基类型_C++构造数据类型
  3. oracle网卡,Oracle_bond网卡配置
  4. 安装 Docker Machine
  5. json增加反斜杠 php_thinkphp5.1.x~5.2.x版本反序列化链挖掘分析
  6. python线程池的使用
  7. oracle创建用户
  8. CodeSmith 简单使用和常用模板
  9. windows双开微信多开微信
  10. pc安装android,在电脑上安装安卓的过程
  11. 平面几何----蝴蝶定理的证明
  12. 计算机的开机自检是由什么完成的,什么是开机自检 取消开机自检方法【方法详解】...
  13. 如何使用Flutter封装即时通讯IM框架开发插件
  14. linux终端分屏工具tumx
  15. 会声会影2022测试新版本号V25.0.0.373
  16. 页面报404错误有哪些原因?
  17. 欧拉公式推导(e^iπ+1=0)
  18. LaTeX 注释快捷键
  19. python正则表达式入门
  20. 强在工业互联网的欧洲,为何没有牛逼的互联网公司?

热门文章

  1. nio-buffer
  2. 谷歌Colab 免费运行pytorch
  3. .net MVC 下拉多级联动及MVC Html.DropDownList 和DropDownListFor
  4. EOS开发技术资料汇总
  5. JavaWeb前后端分离架构
  6. web前端网页设计与制作——华夏第一县HTML+CSS+JavaScript
  7. gt740m显卡linux驱动,NVIDIA GeForce GT 740驱动
  8. MTK 11A SMS
  9. 台州学院计算机专业在全国排名,台州学院最好的专业(什么专业最好)
  10. 不安全的监控摄像头有多可怕......