华为机考真题 -- 亲子游戏

题目描述:

宝宝和妈妈参加亲子游戏,在一个二维矩阵(N*N)的格子地图上,宝宝和妈妈抽签决定各自的位置,地图上每个格子有不同的糖果数量,部分格子有障碍物。

游戏规则是妈妈必须在最短的时间(每个单位时间只能走一步)到达宝宝的位置,路上的所有糖果都可以拿走,不能走障碍物的格子,只能上下左右走。

请问妈妈在最短到达宝宝位置的时间内最多拿到多少糖果(优先考虑最短时间到达的情况下尽可能多拿糖果)。

输入描述:

第一行输入为 N,N 表示二维矩阵的大小;
之后 N 行,每行有 N 个值,表格矩阵每个位置的值,其中:
-3:妈妈
-2:宝宝
-1:障碍
≥0:糖果数(0表示没有糖果,但是可以走)

输出描述 :

输出妈妈在最短到达宝宝位置的时间内最多拿到多少糖果,行末无多余空格

备注:地图最大 50*50

示例1:

输入
4
3 2 1 -3
1 -1 1 1
1 1 -1 2
-2 1 2 3

输出
9

示例2:

输入
4
3 2 1 -3
-1 -1 1 1
1 1 -1 2
-2 1 -1 3

输出
-1

C++源码:

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

const int MAX_N = 50;
int dx[] = { 0, 1, 0, -1 };
int dy[] = { 1, 0, -1, 0 };
int n;
int grid[MAX_N][MAX_N];
int baby_x, baby_y, mom_x, mom_y;

struct State {
    int x, y, steps, candies;
    State(int x_, int y_, int steps_, int candies_) : x(x_), y(y_), steps(steps_), candies(candies_) {}
    bool operator<(const State& other) const {
        return steps > other.steps || (steps == other.steps && candies < other.candies);
    }
};

bool isValid(int x, int y) {
    return x >= 0 && x < n && y >= 0 && y < n && grid[x][y] != -1;
}

int dijkstra() {
    priority_queue<State> pq;
    vector<vector<int>> visited(n, vector<int>(n, 0));

    pq.push(State(mom_x, mom_y, 0, 0));

    while (!pq.empty()) {
        State current = pq.top();
        pq.pop();

        if (visited[current.x][current.y]) continue;
        visited[current.x][current.y] = 1;

        if (current.x == baby_x && current.y == baby_y) {
            return current.candies;
        }

        for (int i = 0; i < 4; ++i) {
            int nx = current.x + dx[i];
            int ny = current.y + dy[i];

            if (isValid(nx, ny)) {
                int nextSteps = current.steps + 1;
                int nextCandies = current.candies + grid[nx][ny];

                if (!visited[nx][ny]) {
                    pq.push(State(nx, ny, nextSteps, nextCandies));
                }
            }
        }
    }

    return -1;
}

int main() {
    cin >> n;

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            cin >> grid[i][j];
            if (grid[i][j] == -3) {
                mom_x = i;
                mom_y = j;
            }
            else if (grid[i][j] == -2) {
                baby_x = i;
                baby_y = j;
            }
        }
    }

    int result = dijkstra();
    cout << result << endl;

    system("pause");
    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华为OD机考真题是指华为公司在招聘过程中所使用的在线机考试题目。这些题目旨在评估应聘者的技术能力、逻辑思维以及解决问题的能力。以下是对华为OD机考真题解读的简要说明。 华为OD机考真题的内容丰富多样,主要涵盖计算机科学、网络技术、算法设计、数据结构等多个领域。对于应聘者来说,这些题目不仅要求具备扎实的专业知识,还要求能够将知识应用于实际场景中,并能够灵活运用、创新思考。 在解答华为OD机考真题时,应聘者需要具备良好的解题思路和方法。首先,应聘者需要仔细阅读题目,理解题意和要求,明确问题的关键点。其次,应聘者需要运用所学知识和技能分析问题,并制定解决方案。此时,良好的逻辑思维和分析能力是十分重要的。最后,应聘者需要将解决方案转化为具体的代码实现或解题步骤,并进行测试和验证。 华为OD机考真题的目的是为了筛选出具备优秀技术能力和解决问题能力的人才。在解题过程中,华为注重考察应聘者的创新能力和解决问题的能力,不仅关注结果,还关注解决问题的思路和方法。因此,应聘者在回答真题时除了要给出正确的答案,还需要展现出对问题的全面思考和独立思考的能力。 总之,华为OD机考真题的解答需要应聘者具备扎实的专业知识、良好的解题思路、逻辑思维能力和解决问题的能力。这些真题旨在筛选出具备创新思维和解决问题能力的优秀人才。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值