小红书笔试 小红书笔试题 0908

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

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

第一题

题目:机器人

小红书的冒险家们!今天,我们要进入一个充满挑战的高科技迷言。这是一张由小红书科技部最新研发的网格地图,每个格子都营着秘密一它们内置了自动滑行带!这些滑行带会让所有进入它们的机器人自动翻一个特定方向滑行。网格地图每个格子都藏着秘密一它们内置了自动滑行带!这些滑行带会让所有进入它们的机器人自动朝一个特定方向滑行。具体来说,一张n*m的网格地图,左上角为(1,1),右下角为(n,m),每个格子有一个滑行带,前进方向为L,R,U,D,分别表示左右上下四个方向前进。

  • 如果第t时刻,机器人位于(i,j),(i,j)滑行带前进方向为L,则第t+1时刻机器人位于(i,j-1),
  • 如果第t时刻,机器人位于(i,j),(i,j)滑行带前进方向为R,则第t+1时刻机器人位于(i,j+1)
  • 如果第t时刻,机器人位于(i,j),(i,j)小滑行带前进方向为U,则第t+1时刻机器人位于(i-1,j)
  • 如果第t时刻,机器人位于(i,j),(i,j)小滑行带前进方向为D,则第t+1时刻机器人位于(i+1,j)。

机器人走出地图后就会毁坏,一个格子可以容纳多个机器人。第0时刻,每个位置都有一个机器人,问:第10^8时刻,地图上还剩下多少个机器人?

输入描述

第一行两个整数nm(1≤nm≤510^3),表示地图大小。

接下来n行,每行一个包含m个字符的字符串,表示每个格子滑行带的方向。

输出描述

输出一行一个整数,表示第10^8时刻,地图上剩下机器人的数量。

样例输入

2 5

LRRLR 

UULLR 

样例输出

6

参考题解

dfs。读取网格地图中每个格子的滑行带方向 (L, R, U, D),然后使用深度优先搜索 (DFS) 追踪每个格子的运动轨迹,记录它是否会滑出地图边界或进入一个循环。具体来说,对每个格子,DFS 会判断机器人是否会进入循环状态或者滑出边界,通过一个二维数组 vis标记每个格子的状态:0表示未访问,1表示已访问且在地图内,-1表示滑出了地图边界。最后,统计所有标记为 1的格子数,这些格子的机器人在第10^8时刻仍然在地图上。这样,我们能够有效地计算出剩余的机器人数量。

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

#include <bits/stdc++.h>
using namespace std;
vector<vector<char>> mp;
vector<vector<int>> vis;
int n, m;
pair<int, int> move(int x, int y) {
 if (mp[x][y] == 'U') {
  return { x - 1,y };
 }
 if (mp[x][y] == 'D') {
  return { x + 1,y };
 }
 if (mp[x][y] == 'L') {
  return { x,y - 1 };
 }
 if (mp[x][y] == 'R') {
  return { x,y + 1 };
 }
 return { x,y };
}
int dfs(int x, int y) {
 if (vis[x][y]) {
  return vis[x][y];
 }
 vis[x][y] = 1;
 pair<int, int> next = move(x, y);
 if (next.first < 0 || next.first >= n || next.second < 0 || next.second >= m) {
  return vis[x][y] = -1;
 }
 return vis[x][y] = dfs(next.first, next.second);
}

int main() {
 cin >> n >> m;
 mp.resize(n, vector<char>(m));
 vis.resize(n, vector<int>(m));
 for (int i = 0; i < n; i++) {
  for (int j = 0; j < m; j++) {
   cin >> mp[i][j];
  }
 }
 int ans = 0;
 for (int i = 0; i < n; i++) {
  for (int j = 0; j < m; j++) {
   if (dfs(i, j) == 1) {
    ans++;
   }
  }
 }
 cout << ans << endl;
}

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

import java.util.*;

public class Main {
    static char[][] mp;
    static int[][] vis;
    static int n, m;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        mp = new char[n][m];
        vis = new int[n][m];

        for (int i = 0; i < n; i++) {
            String line = sc.next();
            for (int j = 0; j < m; j++) {
                mp[i][j] = line.charAt(j);
            }
        }

        int ans = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (dfs(i, j) == 1) {
                    ans++;
                }
            }
        }
        System.out.println(ans);
        sc.close();
    }

    public static int dfs(int x, int y) {
        if (vis[x][y] != 0) {
            return vis[x][y];
        }
        vis[x][y] = 1;
        int[] next = move(x, y);

        if (next[0] < 0 || next[0] >= n || next[1] < 0 || next[1] >= m) {
            return vis[x][y] = -1;
        }

        return vis[x][y] = dfs(next[0], next[1]);
    }

    public static int[] move(int x, int y) {
        if (mp[x][y] == 'U') {
            return new int[]{x - 1, y};
        }
        if (mp[x][y] == 'D') {
            return new int[]{x + 1, y};
        }
        if (mp[x][y] == 'L') {
            return new int[]{x, y - 1};
        }
        if (mp[x][y] == 'R') {
            return new int[]{x, y + 1};
        }
        return new int[]{x, y};
    }
}

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

def move(x, y):
    if mp[x][y] == 'U':
        return x - 1, y
    if mp[x][y] == 'D':
       

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

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

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

全部评论
妈得,解释跟代码是一个东西嘛?浪费钱的玩意
1 回复 分享
发布于 09-14 13:57 山东

相关推荐

头像
10-22 19:18
上海大学 后端
jopajhhdjwnqk:水印都叠杀人书了
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务