【ybtoj 高效进阶 1.5】【广搜】 荆轲刺秦王




解题思路

预处理
士兵的监测范围可以用查分做
例,士兵监测范围是3,如图

在每一行能被看到的起点+1,看不到的第一个-1
最后用前缀和求出所有范围

广搜
可以向八个方向走已经四个方向瞬移
下一步一共12种走法
用四维标记当前格有没有走过
坐标以及瞬移和隐身的次数
如果当时能被士兵看到,使用隐身
当当前步数比已知答案大,可以跳过
注意瞬移和隐身的限制


代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
struct lzf{int x,y,s,w,b;
}q[7001000];
struct lt{int x,y;
}o;
string c;
int n,m,c1,c2,d,zx,zy,ans=-1;
int fx[13]={0,1,1,0,-1,-1,-1,0,1,0,0,0,0};  //移动的行
int fy[13]={0,0,1,1,1,0,-1,-1,-1,0,0,0,0};  //移动的列
int fw[13]={0,0,0,0,0,0,0,0,0,1,1,1,1};  //使用瞬移的次数
int p[362][362][16][16],b[362][362],a[362][362];
void bfs()
{int h=0,t=1;while (h<t){h++; if (q[h].b+1>ans&&ans!=-1) continue;  //当前步数大于已知答案for (int i=1;i<=12;i++){int xx=q[h].x+fx[i],yy=q[h].y+fy[i],xy=q[h].w+fw[i],ys=q[h].s; if (xx<1||xx>n||yy<1||yy>m||xy>c2||b[xx][yy]==1) continue;  //不能走,或瞬移超过限制,或有士兵if (a[xx][yy]>0) ys++;  //被士兵看到if (ys>c1||p[xx][yy][xy][ys]) continue;  //走过或隐身超限制q[++t]=(lzf){xx,yy,ys,xy,q[h].b+1}; p[xx][yy][xy][ys]=1;  //入队,标记if (xx==zx&&yy==zy){if ((ans==-1)||(q[t].b<ans)||(q[t].b==ans&&o.x+o.y>xy+ys)||(q[t].b==ans&&o.x+o.y==xy+ys&&o.y>ys))  //更新答案{ans=q[t].b; o.x=xy;o.y=ys;}}}}if (ans==-1) {cout<<-1;return;}cout<<ans<<" "<<o.y<<" "<<o.x<<endl;
}
int main()
{scanf("%d%d%d%d%d",&n,&m,&c1,&c2,&d);fx[9]=d,fy[10]=d,fx[11]=-d,fy[12]=-d;  //使用瞬移移动的变化for (int i=1;i<=n;i++){for (int j=1;j<=m;j++){cin>>c; if (c==".") continue;if (c=="S"){q[1].x=i,q[1].y=j,p[i][j][0][0]=1;continue;}if (c=="T"){zx=i,zy=j;continue;}int x=0;for (int k=0;k<c.size();k++) x=x*10+c[k]-48; x--; b[i][j]=1; for (int k=max(1,i-x);k<=min(n,i+x);k++){int l=max(1,j-x+abs(i-k));int r=min(m,j+x-abs(i-k));a[k][l]++,a[k][r+1]--; }  //查分预处理}}for (int i=1;i<=n;i++)for (int j=1;j<=m;j++)a[i][j]+=a[i][j-1];  //前缀和bfs();return 0;
}

【ybtoj 高效进阶 1.5】【广搜】 荆轲刺秦王相关推荐

  1. 【Ybtoj 第5章 例题4】荆轲刺秦王【广搜】

    解题思路 调了我一个上午加一个中午的题啊啊啊啊啊!!! 对于每一个点记录{x,y,c1x,y,c1x,y,c1隐身使用次数,c2c2c2瞬移使用次数,步数t} 对于一个点,向它能走到的点尝试扩展 没有 ...

  2. YbtOJ 广度搜索课堂过关 例4 荆轲刺秦王【bfs】

    题目 思路 这道题其实思考难度不大, 主要是有一堆细节,码量也很大, 非常考验bfs的基础,我调了两个多小时. 我们需要分情况处理,分成用瞬移和不用瞬移两板块: 然后再分别判断是否要隐身,维护一下状态 ...

  3. 【ybtoj】荆轲刺秦王

    荆轲刺秦王 题目描述 输入格式 第一行五个整数n,m,c1,c2,dn,m,c_1,c_2,dn,m,c1​,c2​,d,代表地图的大小为n*m隐身的使用限制次数为c1c_1c1​,瞬移的使用次数为c ...

  4. 【ybtoj】【BFS】【例题4】荆轲刺秦王

    [例题4]荆轲刺秦王 Link 解题思路 Code Link 传送门 题目 解题思路 wcnmd,我就无语了,搞了我一天的题,就nm数组开小了,wcnm 守卫监视范围 差分:但我不会,这题数据太淼,直 ...

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

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

  6. 荆轲刺秦王--咸阳巧遇(剧本)

    荆轲刺秦王 咸阳巧遇 左丰.杨庆华等 1 (咸阳城,蒙骜交警模样,吹着口哨,挥舞着红绿旗,指挥着交通.) 蒙骜:咳咳,你,走路不看旗子!你这匹马,逆向行驶,知道吗?跟你们讲过多少遍了......要不怎 ...

  7. 洛谷6474[NOI Online #2 入门组]荆轲刺秦王

    题目背景 本测试数据为脚造,欢迎提供hack. 第18组数据卡了很多人,放于附件中供检查. 题目描述 时隔数年,刺客荆轲再次来到咸阳宫,试图刺杀嬴政. 咸阳宫的地图可以描述为一个 n 行 m 列的矩形 ...

  8. 洛谷P6474荆轲刺秦王

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

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

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

最新文章

  1. Swift学习:基础部分(The Basics)
  2. 【Android】 常用的Intent
  3. 乙肝疫苗该怎么打(转)
  4. Hive _偏门常用查询函数(三)附带实例(Rank)
  5. 前端工程师有哪些面试技巧值得掌握?
  6. 前端学习(2714):重读vue电商网站34之侧边栏路由改造
  7. linux 监听日志_Linux系统取证概述
  8. 不要束缚:为什么我们会错过GitHub条纹
  9. json中含有Unicode的处理办法 C#
  10. 关于android LinearLayout的比例布局(转载)
  11. r-cnn 行人检测_了解用于对象检测的快速R-CNN和快速R-CNN。
  12. ArcGIS中裁剪(clip)出现000117错误的解决办法
  13. 指数基金的分类以及投资方法
  14. MATLAB -plotyy函数
  15. Linux终端收听mms流媒体电台
  16. 笔记本电脑外接显示器以后检测不到笔记本电脑原来的显示器,把hdmi拔出来了也没用
  17. ALGO-986 藏匿的刺客 C++
  18. 豆瓣首页话题输入框的实现
  19. 股票 江恩二十一条买卖法则
  20. 2022年北京大数据技能大赛“隐私计算”赛道初赛完结!12强出炉

热门文章

  1. 网络游戏台式计算机的配置推荐,玩游戏的台式机需要什么配置?为你推荐最实用的配置!...
  2. 三国志战略版:四大阵营武将总结——蜀国篇
  3. WIN10安装office2003/7失败 WIN10安装office2003权限不足解决
  4. axios请求失败、请求超时重新发送请求
  5. gt740m显卡linux驱动,NVIDIA GeForce GT 740驱动
  6. 动态规划 之 历届试题 格子刷油漆
  7. 渗透小白4:CTF实践
  8. 卡巴斯基:高达98%的WannaCry 受害者运行的是 Windows 7系统
  9. 站长在线零基础Python完全自学教程18:Python中的集合完全解读
  10. CenterNet: Keypoint Triplets for Object Detection ----- 论文翻译理解