题目描述:(视野范围)
假设MN的地图中,玩家A坐标为(X,Y),坐标值从1开始,玩家视野范围为以玩家为中心的2R+1的正方形。
玩家周围的其它玩家在若干时间内执行移动操作,每次移动若干格子,移动可以朝上下左右移动。求给定的若干个时间点内,玩家的A的视野范围是多少。
输入:
第一行五个数字,M,N,X,Y,R。
第二行一个数字代表周围玩家数量k。
接下去k行为玩家的初始坐标(X1,Y1),(X2,Y2)……
然后是一个数字C,表示其它玩家的移动操作次数。
接下来C行,每行三个数字和一个字符,P,T,S,dir,表示玩家P在第T秒朝着dir方向移动了S个格子。其中dir用WASD表示上左下右。
接下来一个数字表示要查询的时间点数量D,
再接下来一行为D个数字,表示要查询的第几秒的情况。
输出:
输出一行,表示查询的时间点范围内有的人数,用空格隔开
注意操作和查询的输入不一定按照时间顺序排序,且保证同一时间同意玩家最多移动一次,若距离超出边界,则停边界上
- 思路: 先把操作和查询按时间顺序排序,然后从时间0到查询的最大时间开始遍历,如果当前时间有玩家有移动操作,则对该玩家进行移动操作,当该时间点所有玩家移动操作结束后,判断此时是否为查询时间点,是则计算此时在范围内的玩家人数,并保存,
- 要注意的是移动范围如果超过边界,只能停在边界
- 输出是要按照原来的查询时间点顺序输出
下面是按照以上思路写的代码,但是只过了65%,不知道是哪些细节没考虑到,若大佬发现或知道哪里有问题,请在评论区帮忙指出来呀,感谢~
//65%
#include <iostream>
#include <algorithm>
#include <vector>
#include <unordered_map>
using namespace std;
struct playerOP
{
int P;
int T;
int S;//P move S IN time T
char dir;//WSAD
};
int main() {
int M, N, X, Y, R;
cin >> N >> M >> X >> Y >> R; //N->x,M->y
int rangeX1 = max(X - R, 1), rangeX2 = min(X + R, N);
int rangeY1 = max(Y - R, 1), rangeY2 = min(Y + R, M);
int k;
cin >> k; //k player
vector<