/* 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)的更多相关文章

  1. “知乎杯”2018 CCF 大学生计算机系统与程序设计竞赛 分组加密器(encryption)

    分组加密器(encryption) 题解点这里 #include<map> #include<stack> #include<vector> #include< ...

  2. “知乎杯”2018 CCF 大学生计算机系统与程序设计竞赛 贪心算法(greedy)

    --> 贪心算法 1)题解 •        分别用V0.V1和V>=2表示度为0.1以及至少为2的顶点集合 •        对于每个顶点,维护三个属性: •        degree ...

  3. 中国大学生计算机系统与程序设计竞赛 CCF-CCSP-2016 选座( ticket_chooser )

    选座( ticket_chooser ) 不会正解,欢迎讨论 //60分 #include<cstdio> #define max(a,b) (a)>(b)?a:b #define ...

  4. 中国大学生计算机系统与程序设计竞赛 CCF-CCSP-2017 串行调度(serial)

    串行调度(serial) 除等价条件, 根据题意设置限制条件,然后求字典序最小拓扑序. 简洁版 #include<bits/stdc++.h> using namespace std; ; ...

  5. "字节跳动杯"2018中国大学生程序设计竞赛-女生专场 Solution

    A - 口算训练 题意:询问 $[L, R]$区间内 的所有数的乘积是否是D的倍数 思路:考虑分解质因数 显然,一个数$x > \sqrt{x} 的质因子只有一个$ 那么我们考虑将小于$\sqr ...

  6. "字节跳动杯"2018中国大学生程序设计竞赛-女生专场

    口算训练 #include <iostream> #include <algorithm> #include <cstring> #include <cstd ...

  7. “纽劢科技杯”第十六届同济大学程序设计竞赛暨上海邀请赛同步赛 J-张老师的游戏

    传送门 题目描述     在空闲时间,张老师习惯性地和菜哭武玩起了取石子游戏,这次的游戏规则有些不同,在他们面前有n堆石子,其中,第i堆石子的个数为a[i],现在制定规则如下:     从张老师开始, ...

  8. CTF 湖湘杯 2018 WriteUp (部分)

    湖湘杯 2018 WriteUp (部分),欢迎转载,转载请注明出处! 1.  CodeCheck(WEB) 测试admin ‘ or ‘1’=’1’# ,php报错.点击登录框下面的滚动通知,URL ...

  9. 2018 ACM 国际大学生程序设计竞赛上海大都会部分题解

    题目链接 2018 ACM 国际大学生程序设计竞赛上海大都会 下午午休起床被同学叫去打比赛233 然后已经过了2.5h了 先挑过得多的做了 .... A题 rand x*n 次点,每次judge一个点 ...

随机推荐

  1. git 学习笔记---操作标签

    如果标签打错了,也可以删除: $ git tag -d v0.1 Deleted tag 'v0.1' (was f15b0dd) 因为创建的标签都只存储在本地,不会自动推送到远程.所以,打错的标签可 ...

  2. Linux文件比对,批量复制

    --背景 工作中突然有一天文件服务器空间满了,导致文件存不进去,立马换了另外一台服务器作为文件服务器,将服务器挂载上去,原来的服务器修复之后需要重新换回来,但是需要将临时使用的服务器内的文件迁移至原文 ...

  3. 视频推流模式HLS,HTTP,RTSP,RTMP协议的区别

    HTTP: 先通过服务器将FLV下载到本地缓存,然后再通过NetConnection的本地连接来播放这个FLV,这种方法是播放本地的视频,并不是播放服务器的视频.因此在本地缓存里可以找到这个FLV.其 ...

  4. Win10家庭版升级到企业版的方法

    一.家庭版升级企业版 1.右键单击[此电脑]——>属性 2.点击更改产品密钥 3.输入密钥:NPPR9-FWDCX-D2C8J-H872K-2YT43 4.点击下一步,验证结束后点击开始升级,然 ...

  5. in __init__ self._traceback = tf_stack.extract_stack()的一个原因

    这样就会出错,原因在于函数返回为三个变量,若直接向写入函数那样运用sess.run()得到,就会导致错误. sess=tf.Session() sess.run(tf.initialize_all_v ...

  6. SqlDataSource控件超时的困惑

      想用最简单的SqlDataSource控件完成对一个记录数很多的表的查询操作,结果出现超时异常,找了些解决方法都不奏效,后来在www.codeproject.com查到高手也放弃了用控件的方法,于 ...

  7. Linux Samba服务器的安装

    Samba最大的功能就是可以用于Linux与windows系统直接的文件共享和打印共享,也可以用于Linux与Linux之间的资源共享 安装 # yum install samba samba-cli ...

  8. idea2019的安装与激活

    1.安装及相关资料下载 链接:https://pan.baidu.com/s/1njKjorAvaWftuGCvCQzP3A 提取码:r8h8 2.安装步骤 几乎是傻瓜式的安装,点击下一步即可 注意两 ...

  9. springboot+vue2.x 解决session跨域失效问题

    服务端SpringBoot2.x   :localhost:8082 前端Vue2.x                 :localhost:81 前后端的端口号不同,为跨域,导致前端访问后端时,每次 ...

  10. C/C++调试:gdbserver的简单使用

    1.角色:host和target host是运行gdb的机器 target是运行gdbserver的机器 gdbserver提供一个网络服务,gdb remote到gdbserver上后进行调试 2. ...