题目

一道模拟题,问题不是很大,主要需要读题清晰,且算法的操作顺序要搞明白,比如在每一秒的开始,所有无人机移动,然后再一步一步操作。

然后就是判断方向是否一致了,细节还是很多的。

#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 封锁的更多相关文章

  1. 洛谷 P5506 封锁

    目录 题目 思路 \(Code\) 题目 P5506 封锁 思路 模拟 \(\large\text{读题一定要细心}\) 解释都在代码里. \(Code\) #include<bits/stdc ...

  2. 洛谷P1330封锁阳光大学[二分图染色]

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

  3. 洛谷P1330 封锁阳光大学

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

  4. 洛谷 P1330 封锁阳光大学 Label:染色问题

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

  5. 洛谷——P1330 封锁阳光大学

    P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构 ...

  6. 洛谷P1330 封锁阳光大学 [图论,染色]

    题目传送门 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构 ...

  7. 洛谷 P1330 封锁阳光大学

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

  8. 洛谷P1330 封锁阳光大学(二分图染色)

    P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构 ...

  9. 洛谷 P1330 封锁阳光大学题解

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

随机推荐

  1. ASP.NET WebAPI 连接数据库

    ASP.NET Web API 是一种框架,用于轻松构建可以访问多种客户端(包括浏览器和移动设备)的 HTTP 服务. ASP.NET Web API 是一种用于在 .NET Framework 上构 ...

  2. Java8一Lambda与函数式接口

    关于Lambda表示在工作学习中会经常用到,但并没有全面的去了解.在这里做一个较为详细的记录供以后学习查阅.主要参考Java 8 Lambda 表达式 引言 Java8之前,我们在使用Runnale创 ...

  3. 7、注解@Mapper、@MapperScan

    7.注解@Mapper.@MapperScan 2018年09月20日 11:12:41 飞奔的加瓦 阅读数 3284    版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载. https ...

  4. vue项目在ie中空白问题

    vue项目在ie浏览器中出现空白,f12打开后发现在body下面就只有一个div盒子,因此我们可以猜测就是js没有引入导致的,所有网上看了一些相关的才知道,在ie中无法解析es6或者版本更高的语法,所 ...

  5. 聊聊GIS中的坐标系|再版

    本文约6500字,建议阅读时间15分钟. 作者:博客园/B站/知乎/csdn/小专栏 @秋意正寒 版权:转载请告知,并在转载文上附上转载声明与原文链接(https://www.cnblogs.com/ ...

  6. 【雅思】【绿宝书错词本】List1~12

    List 1 ❤methane n.甲烷,沼气 ❤variety n.品种,种类:变化,多样化 ❤congratulate vt.祝贺 List 2 ✔denote v.表示,指示:意味着 ✔iris ...

  7. PS1变量设置

    \d :代表日期,格式为weekday month date \H :完整的主机名 \h :主机的第一个名字 \t :显示时间为24小时格式(HH:MM:SS) \T :显示时间为12小时格式 \A ...

  8. javascript 四舍五入; js 四舍五入

    方法 Math.round round() 方法可把一个数字舍入为最接近的整数. 对于 0.5,该方法将进行上舍入. 例如,3.5 将舍入为 4,而 -3.5 将舍入为 -3. Math.round( ...

  9. sqlserver添加列(字段)描述

    1.我的表 [id],[name],[type],[date]四个字段,,,表名是library 2.添加列描述 姓名:描述信息 library:表名 被描述字段:name EXECUTE sp_ad ...

  10. 臀部——哑铃&杠铃