洛谷P5506 封锁
一道模拟题,问题不是很大,主要需要读题清晰,且算法的操作顺序要搞明白,比如在每一秒的开始,所有无人机先移动,然后再一步一步操作。
然后就是判断方向是否一致了,细节还是很多的。
#include <bits/stdc++.h>
using namespace std;
int n, t;
struct dir {
int x, y, z;
}fh[90][90];
struct fly {
int x, y, z, h, f, atk, def, mat, mdf, hp, fix, flag;
char c[1210];
}a[1210];
inline void add(int a, int b, int x, int y, int z)
{
fh[a][b].x = x, fh[a][b].y = y, fh[a][b].z = z;
}
inline void init()
{
for (int i = 0; i <= 7; i++)
fh[i][0].x = 0, fh[i][0].y = 0, fh[i][0].z = -1;
for (int i = 0; i <= 7; i++)
fh[i][4].x = 0, fh[i][4].y = 0, fh[i][4].z = 1;
add(0, 1, 1, 0, -1), add(0, 2, 1, 0, 0), add(0, 3, 1, 0, 1);
add(1, 1, 1, 1, -1), add(1, 2, 1, 1, 0), add(1, 3, 1, 1, 1);
add(2, 1, 0, 1, -1), add(2, 2, 0, 1, 0), add(2, 3, 0, 1, 1);
add(3, 1, -1, 1, -1), add(3, 2, -1, 1, 0), add(3, 3, -1, 1, 1);
add(4, 1, -1, 0, -1), add(4, 2, -1, 0, 0), add(4, 3, -1, 0, 1);
add(5, 1, -1, -1, -1), add(5, 2, -1, -1, 0), add(5, 3, -1, -1, 1);
add(6, 1, 0, -1, -1), add(6, 2, 0, -1, 0), add(6, 3, 0, -1, 1);
add(7, 1, 1, -1, -1), add(7, 2, 1, -1, 0), add(7, 3, 1, -1, 1);
scanf("%d%d", &n, &t);
}
int main()
{
init();
for (int j = 1; j <= n; j++)
{
int x, y, z, h, f, atk, def, mat, mdf, hp, fix;
scanf("%d%d%d%d%d%d%d%d%d%d%d", &a[j].x, &a[j].y, &a[j].z, &a[j].h, &a[j].f, &a[j].atk, &a[j].def, &a[j].mat, &a[j].mdf, &a[j].hp, &a[j].fix);
for (int i = 1; i <= t; i++)
cin >> a[j].c[i];
}
for (int i = 1; i <= t; i++)
{
for (int j = 1; j <= n; j++)
if (a[j].flag == 0)
{
a[j].x += fh[a[j].f][a[j].h].x;
a[j].y += fh[a[j].f][a[j].h].y;
a[j].z += fh[a[j].f][a[j].h].z;
}
for (int j = 1; j <= n; j++)
{
if (a[j].hp <= 0 && a[j].flag == 0)
{
a[j].hp = 0;
a[j].flag = -1;
}
if (a[j].flag == -1)
continue;
if (a[j].c[i] == 'N')
continue;
if (a[j].c[i] == 'U' && a[j].h != 4)
a[j].h++;
if (a[j].c[i] == 'D' && a[j].h != 0)
a[j].h--;
if (a[j].c[i] == 'L')
{
if (a[j].f == 7)
a[j].f = 0;
else
a[j].f++;
}
if (a[j].c[i] == 'R')
{
if (a[j].f == 0)
a[j].f = 7;
else
a[j].f--;
}
if (a[j].c[i] == 'F')
a[j].hp += a[j].fix;
if (a[j].c[i] == 'A')
{
for (int k = 1; k <= n; k++)
{
if (k == j || a[k].flag) continue;
int delx, dely, delz, delp;
delx = a[k].x - a[j].x;
dely = a[k].y - a[j].y;
delz = a[k].z - a[j].z;
if (delx == 0 && dely == 0 && delz == 0) continue;
delp = max(0, a[j].atk - a[k].def);
if ((delx == 0 && fh[a[j].f][a[j].h].x != 0) || (delx != 0 && fh[a[j].f][a[j].h].x == 0)) continue;
if ((dely == 0 && fh[a[j].f][a[j].h].y != 0) || (dely != 0 && fh[a[j].f][a[j].h].y == 0)) continue;
if ((delz == 0 && fh[a[j].f][a[j].h].z != 0) || (delz != 0 && fh[a[j].f][a[j].h].z == 0)) continue;
int fx = -1, fy = -1, fz = -1;
if (delx != 0)
fx = (delx / fh[a[j].f][a[j].h].x);
else
fx = 0;
if (dely != 0)
fy = (dely / fh[a[j].f][a[j].h].y);
else
fy = 0;
if (delz != 0)
fz = (delz / fh[a[j].f][a[j].h].z);
else
fz = 0;
if (fx < 0 || fy < 0 || fz < 0) continue;//如果在同一方向,但是还是不准确,具体体现在还要在相同的
if (fx == 0 && fy == 0)
{
a[k].hp -= delp;
break;
}
if (fy == 0 && fz == 0)
{
a[k].hp -= delp;
break;
}
if (fx == 0 && fz == 0)
{
a[k].hp -= delp;
break;
}
if (fz == fy && fy == fx)
{
a[k].hp -= delp;
break;
}
if (fx != fy && fx != 0 && fy != 0) continue;
if (fx != fz && fx != 0 && fz != 0) continue;
if (fz != fy && fz != 0 && fy != 0) continue;
a[k].hp -= delp;
break;
}
}
if (a[j].c[i] == 'M') // 判断方向
{
for (int k = 1; k <= n; k++)
{
if (k == j || a[k].flag) continue;
int delx, dely, delz, delp;
delx = a[k].x - a[j].x;
dely = a[k].y - a[j].y;
delz = a[k].z - a[j].z;
if (delx == 0 && dely == 0 && delz == 0) continue;
delp = max(0, a[j].mat - a[k].mdf);
if ((delx == 0 && fh[a[j].f][a[j].h].x != 0) || (delx != 0 && fh[a[j].f][a[j].h].x == 0)) continue;//如果一个数动了,一个数没动,就不行。
if ((dely == 0 && fh[a[j].f][a[j].h].y != 0) || (dely != 0 && fh[a[j].f][a[j].h].y == 0)) continue;//同理
if ((delz == 0 && fh[a[j].f][a[j].h].z != 0) || (delz != 0 && fh[a[j].f][a[j].h].z == 0)) continue;
int fx = -1, fy = -1, fz = -1;
if (delx != 0)
fx = (delx / fh[a[j].f][a[j].h].x);
else
fx = 0;
if (dely != 0)
fy = (dely / fh[a[j].f][a[j].h].y);
else
fy = 0;
if (delz != 0)
fz = (delz / fh[a[j].f][a[j].h].z);
else
fz = 0;
if (fx < 0 || fy < 0 || fz < 0) continue;// 如果有一个方向不
if (fx == 0 && fy == 0)//
{
a[k].hp -= delp;
continue;
}
if (fy == 0 && fz == 0)
{
a[k].hp -= delp;
continue;
}
if (fx == 0 && fz == 0)
{
a[k].hp -= delp;
continue;
}
if (fx != fy && fx != 0 && fy != 0) continue;
if (fx != fz && fx != 0 && fz != 0) continue;
if (fz != fy && fz != 0 && fy != 0) continue;
if (fz == fy && fy == fx)
{
a[k].hp -= delp;
continue;
}
a[k].hp -= delp;
}
}
}
}
for (int i = 1; i <= n; i++)
printf("%d %d %d %d\n", a[i].x, a[i].y, a[i].z, a[i].hp);
return 0;
}
洛谷P5506 封锁的更多相关文章
- 洛谷 P5506 封锁
目录 题目 思路 \(Code\) 题目 P5506 封锁 思路 模拟 \(\large\text{读题一定要细心}\) 解释都在代码里. \(Code\) #include<bits/stdc ...
- 洛谷P1330封锁阳光大学[二分图染色]
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
- 洛谷P1330 封锁阳光大学
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
- 洛谷 P1330 封锁阳光大学 Label:染色问题
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
- 洛谷——P1330 封锁阳光大学
P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构 ...
- 洛谷P1330 封锁阳光大学 [图论,染色]
题目传送门 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构 ...
- 洛谷 P1330 封锁阳光大学
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
- 洛谷P1330 封锁阳光大学(二分图染色)
P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构 ...
- 洛谷 P1330 封锁阳光大学题解
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
随机推荐
- 温故知新-网络基础1-ip地址计算
网络地址换算 1.网络地址分类 A类:0.0.0.0到127.255.255.255 255.0.0.0/8 B类:128.0.0.0到191.255.255.255 255.255.0.0/16 C ...
- navicat 连接 mysql 提示Client does not support authentication protocol requested by server错误
安装完mysql后,命令行登录没问题,但是用Navicat连接出现提示性错误.Mysql版本为:8.0.15 命令如下: 1.use mysql; 2.alter user 'root'@'local ...
- DDL和DML 的区别
DDL (Data Definition Language 数据定义语言) create table 创建表 alter table 修改表 drop table 删除表 truncate table ...
- Process.Start cmd 参数空格问题解决
Process.Start("cmd.exe", "/c start \"title\" \"C:\\Program Files\\a. ...
- NIO开发Http服务器(3):核心配置和Request封装
最近学习了Java NIO技术,觉得不能再去写一些Hello World的学习demo了,而且也不想再像学习IO时那样编写一个控制台(或者带界面)聊天室.我们是做WEB开发的,整天围着tomcat.n ...
- win10远程桌面 CredSSP加密Oracle修正的解决办法
小编在登录远程桌面的时候一直显示由于CredSSP加密Oracle修正 的警告,连接不上.最终通过以下办法解决了 首先点击windows+R键 输入gpedit.msc,点击确定. 然后依次选择:计算 ...
- HTML学习摘要5
DAY 5 HTML <address> 元素定义文档或文章的联系信息(作者/拥有者). 此元素通常以斜体显示.大多数浏览器会在此元素前后添加折行. HTML <cite> 元 ...
- iOS 关键词assign、strong、copy、weak、unsafe_unretained
关键词assign.strong.copy.weak.unsafe_unretained 影响: 是否开辟新的内存 是否有引用计数增加 strong 指向并拥有该对象.其修饰的对象引用计数会 +1,该 ...
- ceph维护命令小结(基于jewel版)
ceph osd pool 操作小计 #列出所有pool root@ceph:~# ceph osd pool ls [detail] #新建pool root@ceph:~# ceph osd po ...
- mysql 优化修复表
OPTIMIZE TABLE `table_name` 优化表 MyISAM 引擎清理碎片 OPTIMIZE语法: OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABL ...