【发布时间】:2021-06-28 04:03:36
【问题描述】:
这是我为这个问题编写的代码 (https://codingcompetitions.withgoogle.com/kickstart/round/0000000000436140/000000000068c509#problem)。对于示例输入,我得到了正确的答案,但它没有清除测试集 1。
我已经创建了这样的代码,它检查数组的每个元素的上下左右是否为“1”,并查看是否可以从该连接处生成 L。
这些是问题中的条件供参考:
“如果段中的所有单元格都只包含 1,则该段称为“好”。
“L 形”定义为一对无序的线段,具有以下所有属性:
每个细分都必须是“好”细分。 两段必须相互垂直。 段必须共享一个单元,该单元是两个段的端点。 段的长度必须至少为 2。 较长段的长度是较短段长度的两倍。”
#include <bits/stdc++.h>
int main()
{
using namespace std;
int t, u;
cin >> t;
for (u = 1; u <= t; u++) {
int i, j, k, l = 0, a[40][40], r, c, right = 0, left = 0, up = 0, down = 0, downc, upc, lc, rc;
cin >> r >> c;
for (i = 0; i < r; i++) {
for (j = 0; j < c; j++) {
cin >> a[i][j];
}
}
for (i = 0; i < r; i++) {
for (j = 0; j < c; j++) {
if (a[i][j] == 1) {
right = 0;
left = 0;
up = 0;
down = 0;
downc = 0;
upc = 0;
lc = 0;
rc = 0;
for (k = i; k < r; k++) {
if (a[k][j] == 0)
break;
else
down++;
}
for (k = i; k >= 0; k--) {
if (a[k][j] == 0)
break;
else
up++;
}
for (k = j; k < c; k++) {
if (a[i][k] == 0)
break;
else
right++;
}
for (k = j; k >= 0; k--) {
if (a[i][k] == 0)
break;
else
left++;
}
if (!(up > 1 && down > 1 && right > 1 && left > 1)) {
downc = down;
upc = up;
rc = right;
lc = left;
if (up >= 2) {
if (right >= 4) {
while ((upc * 2) > right)
upc--;
l = l + upc - 1;
}
upc = up;
if (left >= 4) {
while ((upc * 2) > left)
upc--;
l = l + upc - 1;
}
upc = up;
}
if (down >= 2) {
if (right >= 4) {
while ((downc * 2) > right)
downc--;
l = l + downc - 1;
}
downc = down;
if (left >= 4) {
while ((downc * 2) > left)
downc--;
l = l + downc - 1;
}
downc = down;
}
if (right >= 2) {
if (up >= 4) {
while ((rc * 2) > up)
rc--;
l = l + rc - 1;
}
rc = right;
if (down >= 4) {
while ((rc * 2) > down)
rc--;
l = l + rc - 1;
}
rc = right;
}
if (left >= 2) {
if (up >= 4) {
while ((lc * 2) > up)
lc--;
l = l + lc - 1;
}
lc = left;
if (down >= 4) {
while ((lc * 2) > down)
lc--;
l = l + lc - 1;
}
lc = left;
}
}
}
}
}
cout << "Case #" << u << ": " << l << "\n";
}
}
【问题讨论】:
-
如果从正确格式化代码开始,format.krzaq.cc 可以提供帮助,或者只使用 ide 的格式化功能。接下来将您的代码拆分为函数,5 或 6 层嵌套太多,无法使您的代码可读。完成后,是时候找出一些失败的输入了,试着考虑一些边缘情况
-
感谢您的链接。我使用它格式化了代码。为了可读性,我将从现在开始尝试使用函数(直到现在我都不必编写这么长的程序,所以跳过了使用 func。)。让我们看看在使用函数重新编写代码时是否发现了错误。同样对于边缘情况,我尝试了多种不同的输入,但它似乎对我有用。
-
如果您希望其他人阅读您的代码,您应该为变量选择更有意义的名称;大多数 IDE 提供了一些重命名 var 的功能,因此您在最初编写代码时不需要键入长 var 名称。此外,仅在循环体和条件/后迭代语句中使用的恕我直言变量应该在循环初始化语句中声明,但这可能只是个人喜好。但是我假设你得到了测试集 2 的段错误(网格高达 1000 X 1000)
标签: c++ arrays multidimensional-array