后端编程题 2 - 青训营笔试练习
题目
抖音电影票业务支持电影院选座,需要在用户买票时自动推荐座位,如果一个用户买了多张票,则需要推荐相邻(上下相邻、左右相邻都可)的座位。现在使用一个二维数组来表示电影院的座位,数组中 0 表示未被选座,1 表示已被选座或者为障碍物,请实现一个方法求出给定影院中最大可推荐的相邻座位个数。
示例
输入:[1,0,0,1,0,0,0] [1,0,0,0,0,1,1] [0,0,0,1,0,0,0] [1,1,0,1,1,0,0]
输出:18
<!--在左边框中修改输入-->
const result = await code.runCode({input: [
1,0,0,1,0,0,0,
1,0,0,0,0,1,1,
0,0,0,1,0,0,0,
1,1,0,1,1,0,0 ]});
#include<iostream>
using namespace std;
int main() {
int a, b;
// cin >> a >> b;
a=4, b=7;
int A[a+1][b+1][2];
for (int i=0;i<a;i++)
for (int j=0;j<b;j++) {
A[i][j][0] = 0;
cin >> A[i][j][1];
}
//为了防止在查右和下的元素时越界报错
for (int i=0;i<a+1;i++) {
A[i][b][0] = 0;
A[i][b][1] = 1;
}
for (int i=0;i<b+1;i++) {
A[a][i][0] = 0;
A[a][i][1] = 1;
}
int count = 0;
for (int i=0;i<a;i++)
for (int j=0;j<b;j++)
//空座位且未被访问过
if (!A[i][j][0]&&!A[i][j][1]) {
A[i][j][0] = 1;
//判断右和下,方位过就不再访问,可能有些落下
if (!A[i][j+1][1]||!A[i+1][j][1]) {
count++;
if (!A[i][j+1][1]) {
count++;
A[i][j+1][0] = 1;
}
if (!A[i+1][j][1]) {
count++;
A[i+1][j][0] = 1;
}
}
//可能漏掉,最右边上下右均为1,但左为0
//或 最右边下左右均为1,但上为0
else if ((j==b-1&&!A[i][j-1][1])||(!i&&!A[i][j-1][1]))
count++;
}
cout << count;
return 0;
}
感觉可能有漏洞啊,不能确定全覆盖。最全的应该是每一个上下左右遍历个遍,但是这样没效率呀。