洛谷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 ...
随机推荐
- 解决COM组件在WPF设计器中命名空间不存在XXX的问题(附带如何在WPF中使用APlayer引擎)
总结起来就是:设计器的版本要跟外部引用的库版本一致,否则XAML设计器就会显示不出来. 例如你的程序是X64的,但是引用的COM组件是32位的,就会显示不出来.这里的建议是:编译一个32位的COM中间 ...
- C#破解dll
使用反编译工具对dll文件进行反编译,找到校验过期的相关代码,反编译工具可以使用ILSpy或Reflector; 使用ildasm.exe工具将dll导出成il文本文件,在该文件中找到相关的代码进行修 ...
- Jenkins多环境持续集成架构实践
自动化部署主要是为了解决项目多.环境多.持续集成慢.部署操作麻烦.手动操作易出错.自动化运维等问题. Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建.部署.自动化 ...
- jQuery 名称发生冲突怎么办【问题】
[问题]jQuery 名称发生冲突怎么办? [答案]jQuery 使用 $ 符号作为 jQuery 的简介方式.某些其他 JavaScript 库中的函数(比如 Prototype)同样使用 $ 符号 ...
- 一分钟读懂低功耗蓝牙(BLE)连接数据包
一分钟读懂低功耗蓝牙(BLE)连接数据包 1.概述 BLE 连接过程中有三个重要的数据包:SCAN_REQ, SCAN_RSP 和 CONNECT_REQ. SCAN_REQ: 扫描请求,由主设备(M ...
- BBPlus团队ALPFA冲刺(肖文恒)
ALPHA冲刺博客 第一天:https://www.cnblogs.com/bbplus/p/11931039.html 第二天:https://www.cnblogs.com/bbplus/p/11 ...
- DRF 视图初识
from django.shortcuts import render from rest_framework.generics import ListAPIView,CreateAPIView,Up ...
- IDEA远程连接和上传文件到服务器
公司电脑是win,所以远程控制服务器就不能用之前自己笔记本ubuntu自带的终端了. 后来在万能的群友的提醒下,IDEA本身就自带了远程功能,摸索了一下,使用IDEA连接服务器并且可以上传文件了. 这 ...
- APC (Asynchronous Procedure Call)
系统创建新线程时,会同时创建与这个线程相关联的队列,即异步过程调用(APC)的队列. 一些异步操作可以通过加入APC来实现,比如我现在学习的IO请求/完成. BOOL ReadFileEx( HAND ...
- HQL基本语法及应用案例
HQL基本语法及应用案例 摘自:<大数据技术体系详解:原理.架构与实践> 一.HQL基本语法 HQL是Hive提供的数据查询语言,由于Hive巨大的影响力,HQL已被越来越多的Hive O ...