“知乎杯”2018 CCF 大学生计算机系统与程序设计竞赛 绝地求生(battleground)
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:等线;
mso-ascii-font-family:等线;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:等线;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:等线;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
CSPfinal 2018
绝地求生
• 对于第1个子任务,由于所有玩家都在安全区内,直接输出玩家初始生命值即可;
• 对于第2个和第4个子任务,由于数据量较小,可以从玩家开始向安全区做路径搜索;
• 对于第3个和第5个子任务,由于数据量较大,可以从安全区做一次路径搜索;
• 每回合开始清除安全区内的障碍物,每回合结束恢复安全区内的障碍物;
• 玩家不能进入障碍物的方格;
if(abstacles[xnew][ynew]==1) return;
• 也不能穿越两个斜向相邻障碍物方格的间隙;
if(abstacles[xold][ynew]&&abstacles[xnew][yold]==1) return;
把所有安全区的点放入队列,bfs,得到初始点到安全区的最短距离。
题目保证每个玩家给出的目标坐标一定在安全区域以内。保证在任意回合,对于任意玩家,都存在一条到达本回合目标位置的移动路线
所以本次的最短距离即为本轮该玩家的扣血量。
if(!vis[np.x][np.y]&&dat(np)&&(!(i&1)||dat(cp+dir[i-1])||dat(cp+dir[i+1])))
简明而清晰的判断下一个点是否可达,下一个点是否出界
- #include<queue>
- #include<cstdio>
- #include<cstring>
- const int N=+;
- const int M=1e5+;
- int n,m,ne,f,h,r,hp[M],dis[N][N];
- bool data[N][N],vis[N][N];
- template <typename T>
- inline void read(T &x){
- T f=;char ch=getchar();x=;
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
- x*=f;
- }
- struct Point{
- int x,y;
- Point(int _x=,int _y=):x(_x),y(_y){}
- inline void Read(){
- read(x);read(y);x++;y++;
- }
- inline int sqr(){
- return x*x+y*y;
- }
- inline Point operator +(const Point &a) const{
- return Point(x+a.x,y+a.y);
- }
- inline Point operator -(const Point &a) const{
- return Point(x-a.x,y-a.y);
- }
- }pos[M],cent;
- const Point dir[]={
- Point(, ), Point(, ), Point(, ), Point(, -),
- Point(, -), Point(-, -), Point(-, ), Point(-, ),
- Point(, )
- };
- inline void Init(){
- read(n);read(m);read(ne);read(f);read(h);
- for(int i=;i<=n;i++) for(int j=;j<=n;j++) data[i][j]=;
- for(int i=;i<=ne;i++){
- Point p;p.Read();
- data[p.x][p.y]=;
- }
- for(int i=;i<=m;i++) pos[i].Read();
- for(int i=;i<=m;i++) hp[i]=h;
- }
- inline bool dat(const Point& a){
- return data[a.x][a.y];
- }
- inline void bfs(){
- std::queue<Point>q;
- memset(vis,,sizeof vis);
- for(int i=std::max(,cent.x-r),rx=std::min(n,cent.x+r);i<=rx;i++){
- for(int j=std::max(,cent.y-r),ry=std::min(n,cent.y+r);j<=ry;j++){
- if((Point(i,j)-cent).sqr()<=r*r){
- q.push(Point(i,j));
- vis[i][j]=;
- dis[i][j]=;
- }
- }
- }
- while(!q.empty()){
- Point cp=q.front();q.pop();
- for(int i=;i<;i++){
- Point np=cp+dir[i];
- if(!vis[np.x][np.y]&&dat(np)&&(!(i&)||dat(cp+dir[i-])||dat(cp+dir[i+]))){
- vis[np.x][np.y]=;
- dis[np.x][np.y]=dis[cp.x][cp.y]+;
- q.push(np);
- }
- }
- }
- for(int i=;i<=m;i++) hp[i]-=dis[pos[i].x][pos[i].y],pos[i].Read();
- }
- inline void Solve(){
- while(f--){
- cent.Read();read(r);
- bfs();
- }
- for(int i=;i<=m;i++) printf("%d\n",hp[i]<?:hp[i]);
- }
- int main(){
- freopen("battleground.in","r",stdin);
- freopen("battleground.out","w",stdout);
- Init();
- Solve();
- fclose(stdin);fclose(stdout);
- return ;
- }
“知乎杯”2018 CCF 大学生计算机系统与程序设计竞赛 绝地求生(battleground)的更多相关文章
- “知乎杯”2018 CCF 大学生计算机系统与程序设计竞赛 分组加密器(encryption)
分组加密器(encryption) 题解点这里 #include<map> #include<stack> #include<vector> #include< ...
- “知乎杯”2018 CCF 大学生计算机系统与程序设计竞赛 贪心算法(greedy)
--> 贪心算法 1)题解 • 分别用V0.V1和V>=2表示度为0.1以及至少为2的顶点集合 • 对于每个顶点,维护三个属性: • degree ...
- 中国大学生计算机系统与程序设计竞赛 CCF-CCSP-2016 选座( ticket_chooser )
选座( ticket_chooser ) 不会正解,欢迎讨论 //60分 #include<cstdio> #define max(a,b) (a)>(b)?a:b #define ...
- 中国大学生计算机系统与程序设计竞赛 CCF-CCSP-2017 串行调度(serial)
串行调度(serial) 除等价条件, 根据题意设置限制条件,然后求字典序最小拓扑序. 简洁版 #include<bits/stdc++.h> using namespace std; ; ...
- "字节跳动杯"2018中国大学生程序设计竞赛-女生专场 Solution
A - 口算训练 题意:询问 $[L, R]$区间内 的所有数的乘积是否是D的倍数 思路:考虑分解质因数 显然,一个数$x > \sqrt{x} 的质因子只有一个$ 那么我们考虑将小于$\sqr ...
- "字节跳动杯"2018中国大学生程序设计竞赛-女生专场
口算训练 #include <iostream> #include <algorithm> #include <cstring> #include <cstd ...
- “纽劢科技杯”第十六届同济大学程序设计竞赛暨上海邀请赛同步赛 J-张老师的游戏
传送门 题目描述 在空闲时间,张老师习惯性地和菜哭武玩起了取石子游戏,这次的游戏规则有些不同,在他们面前有n堆石子,其中,第i堆石子的个数为a[i],现在制定规则如下: 从张老师开始, ...
- CTF 湖湘杯 2018 WriteUp (部分)
湖湘杯 2018 WriteUp (部分),欢迎转载,转载请注明出处! 1. CodeCheck(WEB) 测试admin ‘ or ‘1’=’1’# ,php报错.点击登录框下面的滚动通知,URL ...
- 2018 ACM 国际大学生程序设计竞赛上海大都会部分题解
题目链接 2018 ACM 国际大学生程序设计竞赛上海大都会 下午午休起床被同学叫去打比赛233 然后已经过了2.5h了 先挑过得多的做了 .... A题 rand x*n 次点,每次judge一个点 ...
随机推荐
- The five Day 水平翻转图像,然后反转图像并返回结果
""" 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果. 水平翻转图片就是将图片的每一行都进行翻转,即逆序.例如,水平翻转 [1, 1, 0] 的结 ...
- 移动端的touch click事件的理解+点透
移动端在touch上一共有4个事件 touchstart touchmove touchend touchcancel, touchcancel, 一般来说,它们执行的顺序为 touchstart - ...
- 使用vue-cli搭建vue项目问题解决方案
工欲善其事必先利其器,安装所需环境 node和npm的安装 首先需要安装node环境,直接到官网下载安装包 https://nodejs.org/zh-cn/ 安装node默认安装npm, 不需要重复 ...
- layui 框架 table插件 实现键盘快捷键 切换单元格编辑
最近使用layui的框架时,发现table插件不支持键盘快捷键切换单元格,花了点时间实现此功能. 分享给有需要的朋友们~~~ 效果图 代码: 1.支持 enter,上,下,右键 切换单元格,支持隐藏列 ...
- Node中require第三方模块的规则
Node.js中使用CommonJs模块化机制,通过npm下载的第三方包,我们在项目中引入第三方包都是:let xx = require('第三方包名'),究竟require方法加载第三方包的原理机制 ...
- region、xld有对应的字符串时,将region、xld按照行或列排序的算法实现
用Halcon解码时,如果一张图里面有多个码,它通常可以把这些码都解出来,并且生成对应的解码结果字符串元组(也就是下面的DecodedDataStrings),如果有多个码,那么该元组就有多个元素. ...
- Newtonsoft.Json.Linq.JObject 遍历验证每个属性内容
业务需求,拦截器验证每个请求inputstream(实际是application/json流)的数据,但是json反序列化实体格式不同. var req = filterContext.Request ...
- Android EventBus使用大全
添加依赖 implementation 'org.greenrobot:eventbus:3.1.1' public class HuaDongActivity extends Activity { ...
- restfulframework引用多对多外键
记录一下工作中遇到的问题 最近在写restfulframework,感觉还是很便利的 首先贴一下文档地址 https://www.django-rest-framework.org/api-guide ...
- ECharts快速入门
一.简介 ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Saf ...