Hình vuông lớn nhất trong một lưới [đóng]


10

Thử thách

Đưa ra một lưới như thế này,

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

viết một đoạn mã có thể xác định kích thước của hình vuông lớn nhất không bao gồm '#'. (Câu trả lời cho đầu vào này là 5x5 vì lưới 5x5 dưới cùng bên phải là hình vuông lớn nhất có thể).

Hình vuông phải có cạnh song song với trục x và y.

Như một số chi tiết nhỏ: lưới ban đầu luôn là một hình vuông và chiều dài cạnh của nó được trao cho bạn. Các tọa độ của các ký hiệu '#' cũng được trao cho bạn.

Chi tiết đầu vào

Dòng đầu tiên: N (1 <= N <= 1000), độ dài cạnh của lưới ô vuông và T (1 <= T <= 10.000) số lượng dấu '#'.

Dòng T tiếp theo: Tọa độ của mỗi T #

Các trường hợp thử nghiệm

Đầu vào số 1:

8 3
2 2
2 6
6 3

Kết quả # 1: 5

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

Đầu vào số 2:

8 4
1 1
1 8
8 1
8 8

Kết quả # 2: 6

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

Đầu vào số 3:

5 1
3 3

Kết quả # 3: 2

Đây là một vấn đề , vì vậy mã nhanh nhất được thử nghiệm trên trình biên dịch rextester sẽ thắng.

Chúc vui vẻ!



3
Tuy nhiên, đối với fastest-code1000x1000 là quá nhỏ
l4m2

1
Nhưng rextester không hỗ trợ Jelly hoặc Hexagony.
dùng202729

6
Có khả năng như rextester, tôi có thể khuyên bạn nên sử dụng thử trực tuyến không? Nó chứa nhiều langauges hơn, và là hoạt động cộng đồng.
ATaco

1
"mã nhanh nhất được thử nghiệm trên trình biên dịch rextester thắng" - nhanh nhất về đầu vào nào?
Nathaniel

Câu trả lời:


1

Node.js

Lấy đầu vào là (w, l) , trong đó w là chiều rộng và l là một mảng tọa độ [x, y] . (Điều này có thể được thay đổi nếu định dạng đầu vào thực sự nghiêm ngặt như được mô tả.) Hoạt động trong 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;
}

Hãy thử trực tuyến!


console.log(f( 1000, [...Array(10000)].map(_=>[Math.random()*1000+1|0,Math.random()*1000+1|0]) )); tốn 114ms, mặc dù nó có thể là hiệu quả thấp của ngôn ngữ
l4m2

Nó giống như 8ms bên trong f () sau khi biên dịch JIT. (Nhưng vâng ... câu trả lời sẽ không được ghi theo cách đó.)
Arnauld

Tôi nghi ngờ OP sẽ thêm một tiêu chí chiến thắng khách quan hơn ...
user202729

1

C (gcc)

Không có thuật toán ưa thích nào ở đây, chỉ là gần như bruteforce ... nhưng hey, C rất nhanh.

Đầu vào: Lấy đầu vào từ stdin .

Đầu ra: Ghi đầu ra vào thiết bị xuất chuẩn .

#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);
}

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.