เรือกวาดทุ่นระเบิด Solver


34

เราสร้างเขตข้อมูล Minesweeperแล้ว แต่มีบางคนต้องกวาดเหมืองที่สร้างขึ้นก่อนที่ PCG จะระเบิด!

งานของคุณคือการเขียน Minesweeper Solver ที่เข้ากันได้กับโซลูชันที่ได้รับการยอมรับเล็กน้อยของ“ Working Minesweeper” (การกระทำถูกคั่นด้วยช่องว่างเพื่อให้มีฟิลด์ขนาดใหญ่)

อินพุต:ฟิลด์ Minesweeper ฟิลด์คั่นด้วยช่องว่าง บรรทัดแรกแสดงจำนวนเหมืองทั้งหมด

  • x: ไม่มีใครแตะต้อง
  • !: ตั้งค่าสถานะ
  • หลัก: จำนวนเหมืองรอบ ๆ สนาม

ตัวอย่าง:

10
0 0 1 x x x x x
0 0 2 x x x x x
0 0 2 ! x x x x
0 0 1 2 x x x x
0 0 0 1 x x x x
1 1 0 2 x x x x
x 1 0 2 x x x x
1 1 0 1 x x x x

เอาท์พุท:ขั้นตอนต่อไปของคุณในรูปแบบaction row column(เริ่มต้นที่ศูนย์)

การกระทำที่ถูกต้อง:

  • 0: เปิด
  • 1: วางธง

ตัวอย่าง:

0 1 2

กฎ:

  • คุณเขียนโปรแกรมที่สมบูรณ์ซึ่งรับฟิลด์เดียวเป็นอินพุต (STDIN หรืออาร์กิวเมนต์บรรทัดคำสั่ง) และส่งเอาต์พุตแอคชันเดียว (STDOUT) !ดังนั้นคุณจะไม่สามารถบันทึกรัฐยกเว้น
  • ตัวเลือกของคุณจะต้องเป็นไปตามอัตราต่อรองที่ดีที่สุดเพื่อความอยู่รอด (เช่นถ้ามีการย้ายที่ปลอดภัย 100% เอาไป)
  • นี่คือ ; โซลูชันที่สั้นที่สุด (เป็น UTF-8 ไบต์) จะชนะ

แบบทดสอบ:

การทดสอบเหล่านี้มีจุดประสงค์ในการทดสอบสำหรับสถานการณ์ที่ชัดเจนทั่วไป โปรแกรมของคุณจะต้องใช้งานได้กับทุกสนามทดสอบ

ใน:

4
x x x x
1 2 x x
0 1 2 x
0 0 1 x

ออก (ใด ๆ เหล่านี้):

1 1 2
0 0 2
0 1 3

ใน:

2
x x x
1 ! x
1 1 x

ออก (ใด ๆ เหล่านี้):

0 0 0
0 0 1
0 1 2
0 2 2
1 0 2

ใน:

10
x x x x x x x x
1 3 3 x x x x x
0 1 ! 3 3 4 x x
0 2 3 ! 2 3 x x
0 1 ! 2 2 ! x x

ออก (ใด ๆ เหล่านี้):

1 1 5
1 0 2

ใน:

2
x x x
2 3 1
! 1 0

ออก (ใด ๆ เหล่านี้):

0 0 1
1 0 0
1 0 2

ดี! 1) บางทีสำหรับการทดสอบใครบางคนควรเขียนเทียมทดสอบ: กำหนดเขตมันพิมพ์แต่ละขั้นตอนและว่าโปรแกรมชนะ โปรแกรมควรชนะบนแผนที่โดยไม่มีความกำกวมใด ๆ 2) ฉันสงสัยว่าใครจะใช้การตั้งค่าสถานะ ดูเหมือนว่ามันไม่ควรจำเป็น
Claudiu

สำหรับการทดสอบครั้งแรก ทำไมคุณสามารถที่จะย้ายไปหรือ0 0 2 0 1 3ฉันไม่สามารถเห็นว่าหนึ่งในนั้นจะถือว่าปลอดภัยอย่างไร (ฉันจะต้องไม่ดีพอที่เรือกวาดทุ่นระเบิด ... )
FDinoff

1
อาจเป็นไปได้FหรือPธงรูปลักษณ์ที่ดีกว่า!:)
วิสัยทัศน์

1
@JonathanVanMatre ฟิลด์เป็นที่ว่างเปล่าหนึ่ง แต่จะรับประกันการเปิดครั้งแรกของคุณไม่ใช่ของเราเช่นการทำเหมืองแร่ที่มีอยู่หลังจากที่คลิกครั้งแรก :)
TimWolla

2
ความจริงแล้วสนุก: มีบอร์ดจำนวน จำกัด เท่านั้น (อย่างน้อยในเวอร์ชั่น XP ซึ่งเป็นมาตรฐานที่ยอมรับได้ในการแข่งขัน) กระดานจะถูกเลื่อนไปรอบ ๆ ในขณะที่คุณคลิกที่จุดแรกเพื่อให้แน่ใจว่าคุณไม่ได้คลิกที่เหมือง แต่นอกเหนือจากที่ได้ตัดสินใจแล้วว่าจะใช้กระดานใด
undergroundmonorail

คำตอบ:


17

มาติกา

ยังไม่ได้เล่นกอล์ฟ ต้องการงานเพิ่มเติมในรูปแบบ I / O

t = {{0, 0, 1, x, x, x, x, x}, {0, 0, 2, x, x, x, x, x}, {0, 0, 2, F, x, x, x, x}, 
     {0, 0, 1, 2, x, x, x, x}, {0, 0, 0, 1, x, x, x, x}, {1, 1, 0, 2, x, x, x, x}, 
     {x, 1, 0, 2, x, x, x, x}, {1, 1, 0, 1, x, x, x, x}};
(*Sqrt[2] is  1.5*)
c = Sequence; p = Position;
nums = p[t, _?NumberQ];
fx = Nearest[p[t, x]];
flagMinus[flag_] := If[Norm[# - flag] < 1.5, t[[c @@ #]]--] & /@ nums
flagMinus /@ p[t, F];
g@x_List := Tr[q[#] & /@ x]
eqs = MapIndexed[t[[c @@ (nums[[#2]][[1]])]] == g[#1] &, (fx[#, {8, 1.5}] & /@nums)];
vars = Union@Cases[eqs, _q, 4];
s = Solve[Join[eqs, Thread[0 <= vars < 2]], vars, Integers];
res = (Transpose@s)[[All, All, 2]];
i = 1; plays = Select[{i++, #[[1]], Equal @@ #} & /@ res, #[[3]] &];
Flatten /@ ({#[[2]] /. 1 -> F, List @@ vars[[#[[1]]]] - 1} & /@ plays)

(*
{{0, 0, 3}, {F, 1, 3}, {F, 2, 4}, {0, 3, 4}, {0, 4, 4}, 
 {F, 5, 4}, {F, 6, 0}, {F, 6, 4}, {0, 7, 4}}
*)

แก้ไข: โบนัสแทร็ก

ฉันสร้างสนามเด็กเล่นแบบโต้ตอบที่คำนวณความน่าจะเป็นวางระเบิดโดยการคำนวณวิธีแก้ปัญหาที่เป็นไปได้ทั้งหมดสำหรับการกำหนดค่าที่กำหนด:

กราฟิกทางคณิตศาสตร์

คำแนะนำสำหรับการทดสอบโดยไม่ต้องติดตั้ง Mathematica:

  1. ดาวน์โหลดhttp://pastebin.com/asLC47BWและบันทึกเป็น * .CDF
  2. Dowload สภาพแวดล้อม CDF ฟรีจาก Wolfram Research ที่ https://www.wolfram.com/cdf-player/ (ไม่ใช่ไฟล์ขนาดเล็ก)

แถบเลื่อนจะเปลี่ยนขนาดของบอร์ด นี่เป็นเพียงโปรแกรมสมบูรณ์ไม่ได้รับการทดสอบอย่างสมบูรณ์โปรดรายงานข้อผิดพลาดใด ๆ ฉันไม่ได้ใช้งานคุณสมบัติ "จำนวนระเบิดพร้อมใช้งานทั้งหมด" มันถือว่าไม่มีที่สิ้นสุด

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