2023.04.08-美团春招-第一题-换座位

目录

题目

思路

 C++代码求解


题目

2023.04.08-美团春招-第一题-换座位_第1张图片

2023.04.08-美团春招-第一题-换座位_第2张图片 

输入:

3 3 2
01 10 00
10 00 11
01 00 00 

输出: 

8

 

思路

        仔细阅读题目,“如果一位调整过桌子高度的同学坐到了没有调整过桌子高度的同学的位置,他会调整新位置的桌子到他想要的高度;同样地,如果一位没有调整过桌子高度的同学坐到了调整过桌子高度同学的位置,他也会调整新位置的桌子高度,使其恢复原高度。”也就是说1->0和0->1的情况需要调换位置,0->0(没调过桌椅到未调的位置)、1->1(调过的到调过的位置)都不需要调整。因此,判断操作数是否相等即可,如果不相等,则需要调整位置,数目+1。

        一个简便的做法,让操作位和他右下角的字符串做匹配,超出的下标做一次取模。

op[i][j][k]!=op[(i+1)%n][(j+1)%m][k]

        当i<2,j<2时,都不会存在越界的情况: 

2023.04.08-美团春招-第一题-换座位_第3张图片 

        当i<2,j=2时,也就是[0][2],[1][2]两个位置的值再+1就会产生越界的情况,此时取模的结果如下: 

2023.04.08-美团春招-第一题-换座位_第4张图片

        当i=2时,也就是最后一行的数据,每个下标都会越界,此时取模的情况如下所示: 

 2023.04.08-美团春招-第一题-换座位_第5张图片

         由此可见,无论在哪个位置上,只要有不匹配的01存在,就一定会被比较出来。

 C++代码求解

#include 
using namespace std;
const int N = 210, M = 210, A = 6;
char h[N][M][A];
int n, m, a;

int main() {
    cin >> n >> m >> a;

    getchar();//可加可不加
    for (int i = 0; i < n; i ++) 
    {
        for (int j = 0; j < m; j ++) 
        {
            scanf("%s", h[i][j]);
            getchar();
/*因为在使用scanf函数读取输入时,输入的字符会留在输入缓冲区中,
而在接下来的代码中如果有使用getchar或其他输入函数读取字符时,
可能会读取到之前输入的字符,导致程序运行异常。
因此在使用scanf函数后需要使用getchar函数将输入缓冲区中的多余字符清除,以保证程序正常运行。*/
        }
    }
  
    int res = 0;
    for (int i = 0; i < n; i ++)
    for (int j = 0; j < m; j ++) 
        for (int k = 0; k < a; k ++) 
            if (h[i][j][k] != h[(i + 1) % n][(j + 1) % m][k])
                res ++;
  cout << res << endl;
  return 0;
}

  易出错问题:

        2023.04.08-美团春招-第一题-换座位_第6张图片

如有异议欢迎指正!

文章内容仅为笔者学习记录笔记,如有侵权请与本人联系!

你可能感兴趣的:(算法,c++,算法)