华为笔试 华为笔试题 0925

笔试时间:2024年09月25日 秋招

历史笔试传送门:2023秋招笔试合集

第一题

题目:社交用户影响力计算

社交网络拓扑图中的节点表示社交网络中的用户,边表示两个用户之间的社交连接,边是无向的,两个用户最多只有一条直接相连的边。用户的影响力定义为:从某个社交网络用户开始,找出所有可以在K跳(直接或间接关系)内接触到的其他用户的总个数。请实现一个程序,计算给定社交网络中某个用户在k跳范围内的影响力。

解答要求:时间限制: C/C++1000ms,其他语言:2000ms内存限制: C/C++256MB,其他语言:512MB。

输入描述

第一行输入N MK(三个空格分隔的正整数):N代表社交网络连接总数,M代表需要计算影响力的用户编号,K代表计算影响力的范围。

1<=N,K<=1000,0<=M<1000

接下来的N行,每行两个整数X Y(0<=X,Y<=1000),代表社交网络中一条直接连接的边,如”12“代表1号与2号用户互相直接连接。

用例确保输入有效,无需进行校验。

输出描述

输出M用户在K跳范围内的影响力。

样例输入一

5 0 2

0 1

1 2

2 3

3 4

4 0

样例输出一

4

样例输入二

8 0 3

0 1

0 2

0 3

3 4

2 5

5 4

2 3

1 5

样例输出二

5

参考题解

图论的遍历。使用dfs、bfs进行遍历,遍历的过程中记录下当前的步长,当步长超过了k则退出。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>

using namespace std;

vector<int> G[1010];
int ans = 0;

void dfs(int u, vector<bool>& vst, int stp, int K) {
    if (vst[u] || stp > K) return;
    vst[u] = true;
    ans++;
    for (int next : G[u]) {
        dfs(next, vst, stp + 1, K);
    }
}

int main() {
    int N, M, K;
    cin >> N >> M >> K;

    for (int i = 0; i < N; ++i) {
        int x, y;
        cin >> x >> y;
        G[x].push_back(y);
        G[y].push_back(x);
    }

    vector<bool> vst(1010, false);
    dfs(M, vst, 0, K);

    cout << ans - 1 << endl;
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    static List<Integer>[] G = new ArrayList[1010];
    static int ans = 0;

    static void dfs(int u, boolean[] vst, int stp, int K) {
        if (vst[u] || stp > K) return;
        vst[u] = true;
        ans++;
        for (int next : G[u]) {
            dfs(next, vst, stp + 1, K);
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int M = scanner.nextInt();
        int K = scanner.nextInt();

        for (int i = 0; i < 1010; i++) {
            G[i] = new ArrayList<>();
        }

        for (int i = 0; i < N; i++) {
            int x = scanner.nextInt();
            int y = scanner.nextInt();
            G[x].add(y);
            G[y].add(x);
        }

        boolean[] vst = new boolean[1010];
        dfs(M, vst, 0, K);

        System.out.println(ans - 1);
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

N,M,K = map(int, input().split())
G = [[] for _ in range(1010)]

for _ in range(N):
    x,y = map(int, input().split())
    G[x].append(y)
    G[y].append(x)
ans = 0
def dfs(u,vst,stp):
    if vst[u] or stp > K: return
    vst[u] = True
    global ans
    ans += 1
    for next in G[u]:
        dfs(next, vst, stp + 1)

dfs(M,[False]*(1010), 0)

print(ans-1)

第二题

题目:俄罗斯方块

在俄罗斯方块游戏中,只看下面1种大方块,由四个正方形小方块组成。现在,请计算在给定网格大小的情况下,最多可以放置多少个大方块。夏泳规则如下:1、网格为正芳形网络2、方块不能重香。3、方块不能超出网格的边界。4、网格中部分位置不能放罟方块。

解答要求:时间限制:C/C++1000ms 其他语言:2000ms,内存限制: C/C++256MB,基他语言:512MB

输入描述

n k

y1 x1

y2 x2

表示边长为n的正方形网格,有k个位置不能放置方块,接下来k行坐标对,y表示自上向下的第几行,x表示自左向右的第几列(坐标从0开始编号,左上角为00)。

n的范围:[1,8]

k的范围:[0,64]x、y的范围:[0,n)

输出描述

最多能放下多少大方块。

样例输入

2 0

样例输出

1

说明:只能放下1个

参考题解

回溯。dfs(x,y)函数表示从(x,y)出发,检查(x,y),(x+1,y),(x,y+1),(x+1,y+1)是否都为空,如果是则可以尝试去枚举。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n, k;
vector<vector<int>> grid(1010, vector<int>(1010, 0));
int ans = 0;

pair<int, int> cal(int x, int y) {
    if (y == n - 1) return {x + 1, 0};
    return {x, y + 1};
}

void dfs(int x, int y, int cnt) {
    if (x == n - 1) return;
    ans = max(ans, cnt);
    auto [nx, ny] = cal(x, y);
    dfs(nx, ny, cnt);
    if (x < n - 1 && y < n - 1) {
        if (grid[x][y] == 0 && grid[x + 1][y] == 0 && 
            grid[x][y + 1] == 0 && grid[x + 1][y + 1] == 0) {
            grid[x][y] = 1;
            grid[x + 1][y] = 1;
            grid[x][y + 1] = 1;
            grid[x + 1][y + 1] = 1;
            dfs(nx, ny, cnt + 1);
            grid[x][y] = 0;
            grid[x + 1][y] = 0;
            grid[x][y + 1] = 0;
            grid[x + 1][y + 1] = 0;
        }
    }
}

int main() {
    cin >> n >> k;
    for (int i = 0; i < k; ++i) {
        int x, y;
        cin >> x >> y;
        grid[x][y] 

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论

相关推荐

点赞 评论 收藏
分享
1 2 评论
分享
牛客网
牛客企业服务