网易游戏雷火2021春招游戏研发工程师笔试题

题目描述:(视野范围)
假设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<
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值