グリッドで最大の正方形[クローズ]


10

チャレンジ

このようなグリッドを考えると、

  1 2 3 4 5 6 7 8
1 . . . . . . . .
2 . # . . . # . .
3 . . . . . . . .
4 . . . . . . . .
5 . . . . . . . .
6 . . # . . . . .
7 . . . . . . . .
8 . . . . . . . .

「#」を含まない最大の正方形のサイズを決定できるコードを記述します。(右下の5x5グリッドが可能な最大の四角形であるため、この入力に対する答えは5x5です)。

正方形は、x軸とy軸に平行な辺を持つ必要があります。

細かい点としては、元のグリッドは常に正方形であり、その辺の長さはあなたに与えられます。「#」記号の座標も表示されます。

入力詳細

1行目:N(1 <= N <= 1000)、正方形グリッドの辺の長さ、T(1 <= T <= 10,000)は「#」記号の数。

次のT行:各T#の座標

テストケース

入力#1:

8 3
2 2
2 6
6 3

結果#1:5

================

入力#2:

8 4
1 1
1 8
8 1
8 8

結果#2:6

================

入力#3:

5 1
3 3

結果#3:2

これは問題なので、rextesterコンパイラでテストされた最速のコードが優先されます。

楽しんで!



3
fastest-code1000x1000かかわらず、小さすぎる
l4m2

1
しかし、rextesterはJellyまたはHexagonyをサポートしていません。
user202729

6
rextesterと同じくらいの能力がありますが、代わりにオンラインで試すことをお勧めしますか?より多くの言語が含まれており、コミュニティが運営しています。
ATaco 2018年

1
「rextesterコンパイラーでテストされた最速のコードが優先されます」-どの入力で最速ですか?
ナサニエル

回答:


1

Node.js

入力を(w、l)として受け取ります。ここで、wは幅、lは座標[x、y]の配列です。(これは、入力形式が実際に説明されているように厳密である場合に変更される可能性があります。)O(w²)で機能します。

f = (w, l) => {
  var x, y,
      W = w * w,
      a = new Uint16Array(W),
      best = 0;

  l.forEach(([x, y]) => a[(y - 1) * w + x - 1] = 1);

  for(y = w; y < W; y += w) {
    for(x = y + 1; x < y + w; x++) {
      if(a[x]) {
        a[x] = 0;
      }
      else {
        best = Math.max(
          best,
          a[x] = Math.min(a[x - 1], a[x - w], a[x - w - 1]) + 1
        );
      }
    }
  }

  return best;
}

オンラインでお試しください!


console.log(f( 1000, [...Array(10000)].map(_=>[Math.random()*1000+1|0,Math.random()*1000+1|0]) )); コストは114ミリ秒ですが、言語の効率が低い可能性があります
l4m2

JITコンパイル後のf()内の8msに似ています。(しかし、そうです...答えはそのように採点されることはありません。)
Arnauld

OPがより客観的な勝利基準を追加するのではないかと思います...
user202729

1

C(gcc)

ここには派手なアルゴリズムはありませんが、ほとんどブルートフォースです...しかし、ねえ、Cは高速です。

入力:stdinから入力を受け取ります。

出力:出力をstdoutに書き込みます。

#include <stdio.h>
#include <stdint.h>

int main(void) {
    uint_fast16_t n, t, i, j, h, x, y, flag, biggest = 0;
    scanf("%hi %hi", &n, &t);
    uint_fast8_t m[n][n];
    for (uint_fast16_t c = 0; c < t; ++c) {
        scanf("%hi %hi", &i, &j);
        m[i-1][j-1] = '#';
    }
    for (i = 0; i < n - 1; ++i) {
        for (j = 0; j < n - 1; ++j) {
            flag = 1;
            for (h = 1; flag && i + h < n + 1 && j + h < n + 1; ++h) {
                for (y = i; flag && y < i + h; ++y) {
                    for (x = j; flag && x < j + h; ++x) {
                        if (m[y][x] == '#') flag = 0;
                    }
                }
                if (flag && h > biggest) biggest = h;
            }
        }
    }
    printf("%d", biggest);
}

オンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.