지뢰 찾기 솔버


34

우리는 이미 지뢰 찾기 필드를 생성 했지만 PCG가 폭발하기 전에 누군가가 생성 된 광산을 청소해야합니다!

당신의 임무는 약간의 수정 된 “Working Minesweeper”솔루션 솔루션 과 호환되는 Minesweeper Solver를 작성하는 것입니다 (작업은 공백으로 구분되어 더 큰 필드를 허용합니다).

입력 : 지뢰 찾기 필드, 공백으로 구분 된 필드. 첫 번째 줄은 총 광산 수를 나타냅니다.

  • 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에서 시작)

유효한 조치 :

  • 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
아마도 FP외모 더 플래그에 비해 !:
비전

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 그래픽

Mathematica를 설치하지 않고 테스트하는 방법 :

  1. http://pastebin.com/asLC47BW를 다운로드 하여 * .CDF로 저장하십시오.
  2. https://www.wolfram.com/cdf-player/ (작은 파일 아님)의 Wolfram Research에서 무료 CDF 환경을 다운로드하십시오

슬라이더는 보드 크기를 변경합니다. 이것은 완전히 테스트되지 않은 스케치 프로그램 일뿐입니다. 버그를 신고하십시오. "사용 가능한 총 폭탄 수"기능을 구현하지 않았습니다. 무한하다고 가정합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.