> 文章列表 > 2023美团春招4.8 后端真题和解析 第一题:换座位

2023美团春招4.8 后端真题和解析 第一题:换座位

2023美团春招4.8 后端真题和解析 第一题:换座位

ps:题目均由网友口述提供,禁止商用。

题目名字:换座位

小团班级的座位排成了n行(行从1n编号),共有m个大列(大列从1
m编号),每个大列中有a个小列(小列从1a编号),大列与大列之间有一个过
道。小团的班级每周会换一次座位,首先所有同学都换到后一行,最后一行的同学换
到第一行,然后所有同学都移动到自己右边的那个大列的相同小列上,在最右大列的
同学移动到最左大列。换句话说,对于坐在第 i<n行的同学,新位置在第计i+1行,如果i=n,那么新位置在第一行;对于坐在第j<m 大列的同学,新位置在第j+1大列,
如果 j=m,那么新位置在第一大列;对于坐在第k小列的同学,新位置仍然在第k
列。
小团的学校最近换了一批学生桌椅。这批学生桌椅的优点在于可以调节桌子的高
度,一些同学调整了桌子高度,但是另一些没有。这样换座就变得麻烦了起来,如果
一位调整了桌子高度的同学换到了未调整桌子高度同学的位置,他就会调整新位置的
桌子到他想要的高度,而一位没有调整桌子高度的同学换到了调整过桌子高度同学的
位置,他也会调整新位置的桌子高度,使其恢复原高度。
现在小团的班级要进行换座位了,给出换座位前班级所有桌子的情况,小团想知
道,换一次位置后,有多少同学需要重新调整桌子高度。

输入描述

输入第一行包含三个数,n,m,a,表示n行m列每列a小列。
接下来n行,m列,a小列,其中0表示这个位置未调节桌子高度,1表示已调节桌子高度。
数据范围1≤n,m≤200,2≤n∗m,1≤a≤51\\leq n,m\\leq 200,2\\leq n*m,1\\leq a \\leq 51n,m200,2nm,1a5

输出描述

输出一行表示换座位后有多少个同学需要重新调整桌子高度。

样例

输入:
3 3 2
01 10 00
10 00 11
01 00 00
输出:
8

思路

简单模拟题。
为了解决这个问题,我们可以先分析每个同学换座后的位置,然后统计需要调整桌子高度的人数:
1、创建一个布尔值矩阵,表示每个位置的桌子是否需要调整高度。例如,如果桌子高度已经被调整过,那么对应的矩阵元素为 True,否则为 False
2、遍历矩阵,找到每个同学换座后的位置。
a. 如果同学当前坐在第 i<n 行,那么他们会换到第 i+1 行。
b. 如果同学当前坐在第 i=n 行,那么他们会换到第 1 行。
c. 如果同学当前坐在第 j<m 大列,那么他们会换到第 j+1 大列。
d. 如果同学当前坐在第 j=m 大列,那么他们会换到第 1 大列。
所以位置(i,j) 应该变成((i+1)%n,(j+1)%m)
3、比较每个同学的新位置和原始位置的桌子高度是否相同,如果不同,说明这位同学需要调整桌子高度。
统计需要调整桌子高度的同学数量,输出答案即可。

代码

C++版本

#include <iostream>
#include <vector>
#include <string>int count_students_adjust_height(int n, int m, int a, const std::vector<std::vector<std::vector<bool>>>& adjusted_height_matrix) {int students_to_adjust = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {for (int k = 0; k < a; k++) {int new_i = (i + 1) % n;int new_j = (j + 1) % m;if (adjusted_height_matrix[i][j][k] != adjusted_height_matrix[new_i][new_j][k]) {students_to_adjust++;}}}}return students_to_adjust;
}int main() {int n, m, a;std::cin >> n >> m >> a;std::cin.ignore();std::vector<std::vector<std::vector<bool>>> adjusted_height_matrix(n, std::vector<std::vector<bool>>(m, std::vector<bool>(a)));for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {std::string row;std::cin>>row;for (int k = 0; k < a; k++) {adjusted_height_matrix[i][j][k] = row[k] == '1';}}}std::cout << count_students_adjust_height(n, m, a, adjusted_height_matrix) << std::endl;return 0;
}

Python版本

def count_students_adjust_height(n, m, a, adjusted_height_matrix):students_to_adjust = 0for i in range(n):for j in range(m):for k in range(a):new_i = (i + 1) % nnew_j = (j + 1) % mif adjusted_height_matrix[i][j][k] != adjusted_height_matrix[new_i][new_j][k]:students_to_adjust += 1return students_to_adjustif __name__ == "__main__":n, m, a = map(int, input().split())adjusted_height_matrix = []for _ in range(n):lines = list(map(str,input().split(' ')))adjusted_height_matrix.append([[line[i] == '1' for i in range(a)] for line in lines])print(count_students_adjust_height(n, m, a, adjusted_height_matrix))

Java版本

import java.util.Scanner;public class Main {public static int countStudentsAdjustHeight(int n, int m, int a, boolean[][][] adjustedHeightMatrix) {int studentsToAdjust = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {for (int k = 0; k < a; k++) {int newI = (i + 1) % n;int newJ = (j + 1) % m;if (adjustedHeightMatrix[i][j][k] != adjustedHeightMatrix[newI][newJ][k]) {studentsToAdjust++;}}}}return studentsToAdjust;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int m = scanner.nextInt();int a = scanner.nextInt();scanner.nextLine(); boolean[][][] adjustedHeightMatrix = new boolean[n][m][a];for (int i = 0; i < n; i++) {String[] row = scanner.nextLine().split(" ");for (int j = 0; j < m; j++) {for (int k = 0; k < a; k++) {adjustedHeightMatrix[i][j][k] = row[j].charAt(k) == '1'?true:false;}}}System.out.println(countStudentsAdjustHeight(n, m, a, adjustedHeightMatrix));}
}