4.11网易互娱游戏研发工程师笔试第一题

网易互娱游戏研发工程师,第一道题,40米大刀,代码比较丑,大家可以互相讨论一下,求大佬轻喷~

题目:暂时没有。。。

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

// 自定义的一个9数量级的int最大值,满足最大值*2依然最大值(不会溢出的意思)
const int int_max = 0x3f3f3f3f;

// 获取两点之间的距离
double dis(int x1, int y1, int x2, int y2)
{
    int x = abs(x1 - x2);
    int y = abs(y1 - y2);
    return sqrt(pow(x, 2) + pow(y, 2));
}

// 这个是获取积分和玩家的距离的二维数组,如果不存在积分就会标记为int_max
vector<vector<double>> diss(vector<vector<int>> vvi, int size, int x, int y)
{
    // 申请动态二维数组
    vector<vector<double>> res(size, vector<double>(size, int_max));
    for (int i = 0; i < size; ++i)
    {
        for (int j = 0; j < size; ++j)
        {
            if (vvi[i][j] != 0)
            {
                res[i][j] = dis(x, y, i, j);
            }
        }
    }
    return res;
}

// 取得小于等于大刀距离的积分的坐标
bool getL(vector<vector<double>> &vvi, int len, int &rx, int &ry)
{
    for (int i = 0; i < vvi.size(); ++i)
    {
        for (int j = 0; j < vvi.size(); ++j)
        {
            if (vvi[i][j] <= len)
            {
                vvi[i][j] = int_max;
                rx = i;
                ry = j;
                return true;
            }
        }
    }
    return false;
}

int main(int argc, char const *argv[])
{
    int T;
    cin >> T;
    for (int i = 0; i < T; ++i)
    {
        int M, L;
        cin >> M >> L;
        // 申请动态二维数组
        vector<vector<int>> place(M, vector<int>(M, 0));
        for (int j = 0; j < M; ++j)
        {
            for (int k = 0; k < M; ++k)
            {
                cin >> place[j][k];
            }
        }
        int x, y;
        cin >> x >> y;
        // 获取距离表
        vector<vector<double>> dist = diss(place, M, x, y);
        int rx, ry;
        while (true)
        {
            // 获取坐标
            bool ans = getL(dist, L, rx, ry);
            if (!ans)
            {
                break;
            }
            else
            {
                // 增加大刀长度
                L += place[rx][ry];
            }
        }
        // 输出最终大刀长度
        cout << L << endl;
    }

    // system("pause");

    return 0;
}


#网易笔试##网易互娱##笔试题目##游戏研发工程师#
全部评论
贴一下我的 稀里糊涂给过了 #include <bits/stdc++.h> using namespace std; // 四十米大刀 double inOricl(int x, int y,int m,int n) {     int xx = abs(x - m);     int yy = abs(y - n);     double res = sqrt(xx * xx + yy *yy);     return res; } int main() {     int T;     cin>>T;     while(T--)     {         int M, L;         cin>>M>>L;         int arr[M][M];         for(int i = 0; i < M; i++)         {             for(int j = 0; j < M; j++){                 int x;                 cin>>x;                 arr[i][j] = x;             }         }         int x, y;         cin>>x>>y;         for (int k = 0; k < M; ++k) {             for (int i = 0; i < M; ++i) {                 if(inOricl(x,y,k,i) <= L && arr[k][i] != 0){                     L += arr[k][i];                     arr[k][i] = 0;                     k = -1;                     break;                 }             }         }         cout<<L<<endl;     }     return 0; }
点赞 回复 分享
发布于 2020-04-11 22:13
我是把所有有补给的点,x、y、val包装成一个结构体扔进一个vector里,按离大刀原点距离从小到大排序,while循环一个一个吃就行:1. vector空了表示补给拿完了则break;2. 当前大刀长度砍不到最近的补给则break。 这样主要的时间消耗在排序上,O(klogk)的复杂度,k是有补给的点的数量。
点赞 回复 分享
发布于 2020-04-11 22:11
如果比较距离的话,开方是可以省略的。  然后这题直接先把p不为0的点算好距离,做排序,然后从小到大加就完了
点赞 回复 分享
发布于 2020-04-11 22:09

相关推荐

评论
点赞
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务