洛谷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 ...
随机推荐
- NIO开发Http服务器(2):项目结构
最近学习了Java NIO技术,觉得不能再去写一些Hello World的学习demo了,而且也不想再像学习IO时那样编写一个控制台(或者带界面)聊天室.我们是做WEB开发的,整天围着tomcat.n ...
- Install Gnome desktop
Install Gnome desktop http://www.dinggd.com/index.php/freebsd-8-0-rc1-gnome%E6%A1%8C%E9%9D%A2%E5%AE% ...
- 【洛谷 P4070】 [SDOI2016]生成魔咒(后缀自动机)
题目链接 建出\(SAM\)后,不同子串个数就是\(\sum len(i)-len(fa(i))\) 因为\(SAM\)在线的,所以每加入一个字符就能直接加上其贡献,于是这道题就没了. 因为\(x\) ...
- dubbo源码阅读之自适应扩展
自适应扩展机制 刚开始看代码,其实并不能很好地理解dubbo的自适应扩展机制的作用,我们不妨先把代码的主要逻辑过一遍,梳理一下,在了解了代码细节之后,回过头再来思考自适应扩展的作用,dubbo为什么要 ...
- PHP 中使用ajax时一些常见错误总结整理
这篇文章主要介绍了PHP 中使用ajax时一些常见错误总结整理的相关资料,需要的朋友可以参考下 PHP作为后端时,前端js使用ajax技术进行相互信息传送时,经常会出错误,对于新手来说有些手足无措.总 ...
- css设置图片百分比显示,最简洁的代码
css代码: .img-box { padding-bottom: 100%; } .img-box img { position: absolute; top:; bottom:; left:; r ...
- ArrayList集合实现RandomAccess接口有何作用?为何LinkedList集合却没实现这接口
详见:https://blog.csdn.net/weixin_39148512/article/details/79234817 众所周知,在List集合中,我们经常会用到ArrayList以及Li ...
- Python学习日记(二十三) 类命名空间和组合
类命名空间 在一个类中它的函数(方法)属于动态属性,直接定义的变量属于静态属性 首先先定义一个类,并在这个类里面加入静态变量.属性等然后将一个对象实例化 class Fighter: #定义一个战机的 ...
- gitlab自带的Nginx与原Nginx冲突的解决方案
gitlab 推荐方案2 默认情况下,gitlab使用自带的Nginx,占用80端口,这样就与系统原本安装的Nginx冲突.导致其中一个nginx无法启动 我的gitlab可以正常启动,当再部署一个接 ...
- 2013.6.21 - OpenNER第一天
下午去实验室继续写实验报告,跟伟杰要了一个实验报告,然后大师兄叫我,我们在走廊唠了一会儿. 大 师兄想做Open NE,他说这个会比较难,目前没有人做,因为还没有发现相关的文章,大家研究的都是指定了哪 ...