洛谷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 ...
随机推荐
- web API .net - .net core 对比学习-使用Swagger
根据前两篇的介绍,我们知道.net web api 和 .net core web api在配置方面的不同如下: 1. .net web api的配置是在 App_Stat文件夹里面添加对应的配置类, ...
- 9 同时搜索多个index,或多个type
搜索所有index(慎用): GET /_search 搜一个索引下,所有type,(不指定type即可) GET /beauties/_search 搜多个索引,则多个索引间,用逗号(,)分隔开 ...
- Django使用LDAP
https://github.com/python-ldap/python-ldap Quick usage example: import ldap l = ldap.initialize(&quo ...
- memcpy 速度测试
1. 小米8代i5 3840X2160X4 7.77ms 即34Gbps
- mac 上使用 idea 上传项目代码到阿里云git上
1.Idea 打开需要上传的项目 2.先在本地创建一个git仓库 VCS --> Import into Version Control --> Create Git reposito ...
- mySql入门-(二)
最近刚刚开始学习Mysql,然而学习MySql必经的一个过程就是SQL语句,只有按照文档从头开始学习SQL语句.学习的过程是痛苦的,但是学完的成果是甘甜的. SQL 语法 所有的 SQL 语句都以下列 ...
- JavaScript:将key和value不带双引号的JSON字符串转换成JSON对象的方法
遇到相关的问题,花了两天的时间来解决,深感来之不易,所以做如下的总结,希望遇到此问题的码农能更快的找到解决办法! var jsonArr= [{col:TO_CHAR(HZRQ,'YYYYMM'),t ...
- Qt环境搭建
下载 qtcreator:http://download.qt.io/official_releases/qtcreator/ 编译器(mingw):http://download.qt.io/dev ...
- SpringBoot学习<一>——快速搭建SpringBoot
这是我的第一篇博客,博客记录我以后的学习,包括一些总结之类的东西,当然,这些记录是针对于与我个人而言的,可能有些地方会有不好的,或者出现错误,欢迎大家来指正(如果有人看的话)废话不多说.进入正题:Sp ...
- MySQL Connection--使用tcpkill杀掉MySQL活跃连接
当MySQL连接被打满,连管理员也无法本地登录时,可以考虑使用tcpkill杀掉一些应用服务器创建的连接. CentOS 6安装tcpkill rpm安装包: libnids-1.24-1.el6.x ...