สี่เหลี่ยมจัตุรัสที่ใหญ่ที่สุดในกริด [ปิด]


10

ท้าทาย

ให้กริดแบบนี้

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

เขียนชิ้นส่วนของรหัสที่สามารถกำหนดขนาดของสี่เหลี่ยมจัตุรัสที่ใหญ่ที่สุดที่ไม่รวม '#' (คำตอบของอินพุตนี้คือ 5x5 เนื่องจากตาราง 5x5 ด้านล่างขวาเป็นสี่เหลี่ยมจัตุรัสที่ใหญ่ที่สุดที่เป็นไปได้)

สี่เหลี่ยมจัตุรัสจะต้องมีด้านขนานกับแกน x และ y

ดังรายละเอียดเล็ก ๆ น้อย ๆ : ตารางดั้งเดิมมักจะเป็นสี่เหลี่ยมจัตุรัสและความยาวด้านข้างจะถูกกำหนดให้คุณ พิกัดของสัญลักษณ์ '#' จะมอบให้คุณเช่นกัน

รายละเอียดการป้อนข้อมูล

บรรทัดแรก: N (1 <= N <= 1,000) ความยาวด้านของตารางสี่เหลี่ยมจัตุรัสและ 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จะเป็นผู้ชนะ

มีความสุข!


1
ที่เกี่ยวข้อง
user202729

3
สำหรับfastest-code1000x1000 นั้นเล็กเกินไปแม้ว่า
l4m2

1
แต่ rextester ไม่รองรับ Jelly หรือ Hexagony
user202729

6
ฉันขอแนะนำให้ลองใช้ออนไลน์แทนได้ไหม มันมี langauges อื่น ๆ อีกมากมายและเป็นชุมชนที่ทำงาน
ATaco

1
"โค้ดที่เร็วที่สุดที่ทดสอบกับ rextester compiler ชนะ" - เร็วที่สุดในอินพุตใด
นาธาเนียล

คำตอบ:


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]) )); ค่าใช้จ่าย 114ms แม้ว่ามันอาจจะเป็นภาษาที่มีประสิทธิภาพต่ำ
l4m2

มันเหมือน8ms ภายใน f ()หลังจากการคอมไพล์ JIT (แต่ใช่ ... คำตอบจะไม่ถูกทำคะแนนด้วยวิธีนี้)
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.