คำนวณ 3BV ของ Minesweeper Board


17

3BVของเรือกวาดทุ่นระเบิดคณะกรรมการหมายถึงจำนวนขั้นต่ำของการคลิกซ้ายจำเป็นในการแก้กระดานถ้าคุณรู้อยู่แล้วว่าการแก้ปัญหา มันย่อมาจาก "เกณฑ์มาตรฐานของคณะกรรมการของเบคเทล" นี่คือเว็บไซต์ของเขาอธิบาย

ด้านล่างเป็นบอร์ด Minesweeper ที่แก้ไขแล้ว ธงระบุว่าเหมือง; ไทล์ที่ไม่มีทุ่นระเบิดระบุจำนวนของทุ่นระเบิดที่อยู่ติดกันรวมถึงแนวทแยงมุมยกเว้นไทล์ที่ควรมี "0" จะถูกปล่อยว่างไว้แทน ภาพแสดงกระเบื้องที่จะต้องคลิกเพื่อแก้ปัญหากระดาน

นับ 3BV

จำนวนคลิกต่อ 3BV คือ:

  • หนึ่งรายการสำหรับแต่ละพื้นที่ที่เต็มไปด้วยน้ำท่วมของกระเบื้องว่างเปล่า (ติดกับศูนย์เหมือง) และเพื่อนบ้านที่ไม่ว่าง
  • หนึ่งรายการสำหรับกระเบื้องที่ไม่ใช่ของฉัน

ตัวอย่างอื่น (3BV = 39)

คณะกรรมการเรือกวาดทุ่นระเบิดที่แก้ไขแล้ว คลิกที่จำเป็น


กำหนดอาร์เรย์ 2 มิติของค่า0สำหรับความชัดเจนและ1การเหมืองแร่ (หรือบูล) กลับ 3BV

ขนาดของคณะกรรมการจะต้องมีอย่างน้อย 8x8 และไม่เกิน 24x30 รวม โปรแกรมของคุณควรจัดการบอร์ดที่เป็นไปได้ทั้งหมดไม่ใช่แค่ตัวอย่างเท่านั้น

หมายเหตุ: บอร์ดจะไม่มีเหมืองเท่านั้น

ตัวอย่าง I / O:

[[0,0,0,0,0,0,0,0],
[0,0,0,1,0,0,0,0],
[0,0,0,1,0,0,1,0],
[0,1,0,0,1,0,0,0],
[0,0,1,0,0,0,0,1],
[0,0,0,1,0,0,0,0],
[0,0,0,0,0,0,1,0],
[0,0,0,0,0,0,0,1]]

23

[[0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0],
[0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,1,0,1,1,0,0,0,0,0,0],
[0,1,0,0,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,1,0,0,0,1,0,1,0,1,0],
[0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0],
[0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,0,1],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1],
[0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0],
[0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0],
[1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1],
[0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,1,0,0,0,0,1,1,0,0],
[0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,0,1,1,0,0,0,1,0,0,0,1,1,0,0],
[0,1,1,1,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0],
[0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0],
[0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0]]

187

อาร์เรย์ของจำนวนเต็มตกลงเป็นอินพุตหรือไม่ แต่ละจำนวนเต็มรหัสหนึ่งแถว
Karl Napf

@KarlNapf ไม่ข้อมูลที่ควรรับรู้เป็นกระดานตามที่แสดง
mbomb007

คุณสามารถให้กรณีทดสอบเพิ่มเติมรวมถึงอินพุตจากภาพที่แสดงและกรณีทดสอบขนาดสูงสุดได้หรือไม่
ไมล์

คำตอบ:


15

MATLAB, 92 90 86 83 79 74 72 ไบต์

x=input('');I=@(x)~imdilate(x,ones(3));[C,N]=bwlabel(I(x));nnz(I(C)-x)+N

วิธีการแก้ปัญหานี้ยอมรับอินพุตในรูปแบบของเมทริกซ์ 2 มิติของ 0 และ 1 และจะแสดงค่า 3BV สำหรับอินพุตที่ให้ไว้

นี่คือการสาธิตที่ปรับเปลี่ยนเล็กน้อยใน Octave สำหรับผู้ที่ไม่มี MATLAB

คำอธิบาย

อินพุทเมทริกซ์นั้นถูกขยายโดยใช้เมทริกซ์ขนาด 3 x 3 ของ1's และกลับด้าน (ใช้~) ซึ่งระบุจุดทั้งหมดที่ไม่มีเหมืองเป็นเพื่อนบ้าน ( 1) หรือทำ ( 0) เพื่อตรวจสอบจำนวนของภูมิภาคที่เชื่อมต่อเราจะใช้bwlabelกับป้ายกำกับแต่ละภูมิภาคที่เกี่ยวโยงกันของ1's เอาต์พุตแรกคือเมทริกซ์เลเบล ( 0โดยที่อินพุตเป็นศูนย์และค่าใด ๆ ในช่วง1...Nที่มี1อินพุทอยู่ซึ่งNเป็นดัชนีของกลุ่มที่เชื่อมต่อที่เป็นของมัน) เอาท์พุทที่สองคือจำนวนของภูมิภาค (จำนวนคลิกที่จำเป็นในการเปิดพวกเขา) ผลลัพธ์ของการbwlabelแสดงในภาพด้านซ้าย

ป้อนคำอธิบายรูปภาพที่นี่

เราขยายการส่งออกครั้งแรกของการbwlabelใช้imdilate(ทุกศูนย์ที่ไม่ถูกขยาย) โดยใช้ 3 x 3 เมทริกซ์ของ1's ผลลัพธ์จะปรากฏในภาพที่อยู่ตรงกลาง

ในการพิจารณาจำนวนคลิกที่เหลือเราจะนับสี่เหลี่ยมที่ไม่ได้อยู่ในภูมิภาคที่ขยายนี้ ( ~imdilate()) และไม่ใช่ของฉัน ( -x) (สี่เหลี่ยมสีขาวในภาพด้านขวา) และเพิ่มลงในจำนวนพื้นที่เปิดทั้งหมด (จำนวน สีต่างกันในภาพด้านซ้าย) เพื่อรับ 3BV


9

อ็อกเทฟ, 86 84 79 66 ไบต์

@(x)nnz(~imdilate(c=imerode(~x,o=ones(3)),o)-x)+max(bwlabel(c)(:))

โซลูชันนี้สร้างฟังก์ชันที่ไม่ระบุชื่อansซึ่งสามารถส่งผ่านเมทริกซ์ 2 มิติของ0's และ1' s ตรรกะนั้นเหมือนกับคำตอบ MATLAB ของฉัน แต่ใช้เทคนิคเล็กน้อยที่ Octave เสนอเพื่อประหยัดพื้นที่

โซลูชันนี้ต้องการให้imageติดตั้งแพคเกจ

ตัวอย่างที่นี่


2

MATL, 24 22 21 ไบต์ (ไม่แข่งขัน)

บันทึก 1 ไบต์ขอบคุณ @Luis

4Y6Z+~l2#ZIw7MZ+G+~z+

ลองใช้ที่MATL Online

คำอธิบาย

อีกครั้งนี้คล้ายกับ MATLAB และคำตอบของ Octave สำหรับคำถามนี้

        % Implicitly grab input array
4Y6     % Push the literal [1 1 1; 1 1 1; 1 1 1] to the stack
Z+      % Perform 2D convolution of the input with this array
~       % Negate the result
l2#ZI   % Call bwlabeln which dilates each open region and the second output
        % returns the number of open regions
w       % Flip the top two stack elements
7M      % Push the literal [1 1 1; 1 1 1; 1 1 1] to the stack again
Z+      % Perform 2D convolution
G+      % Explicitly grab the input and add it to the result
~z      % Count the number of 0's in the result (the remaining number of clicks)
+       % Add the total number of remaining clicks to the number of open regions 

ทำไมการไม่แข่งกันล่ะ
CalculatorFeline

1
@CalculatorFeline น่าเสียดายที่bwlabelnฟังก์ชั่นนี้ถูกนำมาใช้กับ MATL หลังจากโพสต์ความท้าทาย
Suever
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.