Vypočítejte 3BV desky Hledání min

3BV Minesweeper deska představuje minimální počet levých kliknutí potřebných k vyřešení desky, pokud již znáte řešení. Je zkratkou pro “ Bechtels Benchmark Value „. Zde je jeho web to vysvětluje.

Níže je vyřešená deska Hledání min. Vlajky označují miny; dlaždice bez min označují počet sousedních dolů, včetně diagonálně, kromě toho, že dlaždice, které by měly mít “ 0 „, zůstanou prázdné. Obrázek ukazuje, na které dlaždice je třeba kliknout, aby se hrací plán vyřešil.

Počítání 3BV

Kliknutí započítaná do 3BV jsou:

  • Jeden pro každou zaplavenou oblast prázdných dlaždic (sousedících nulové miny) a jejich neprázdných sousedů.
  • Jeden pro sebe jiné než těžební dlaždice.

Jiný příklad (3BV = 39)

Vyřešená hra Hledání min Požadovaná kliknutí


Vzhledem k 2D hodnotovému poli 0 pro clear a 1 pro důl (nebo booleovský), vrátit 3BV .

Rozměry desky budou nejméně 8×8 a maximálně 2 4×30, včetně. Váš program by měl zpracovávat všechny možné desky, nejen příklady.

Poznámka: Deska nikdy nebude obsahovat pouze miny.

Příklad 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 

Komentáře

  • Je pole celých čísel v pořádku jako vstup? Každé celé číslo kóduje jeden řádek.
  • @KarlNapf Ne. Vstup by měl být rozpoznatelný jako deska, jak je znázorněno.
  • Mohli byste poskytnout více testovacích případů, případně včetně vstupu založeného na zobrazeném obrázky a možná testovací případ maximálních rozměrů?

odpověď

MATLAB, 92 90 86 83 79 74 72 bytů

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

Toto řešení přijímá vstup ve formě 2D matice 0 „sa 1“ sa zobrazí hodnotu 3BV pro zadaný vstup.

Zde je mírně upravená ukázka v Octave pro ty z vás bez MATLABu.

Vysvětlení

Vstupní matice je dilatována pomocí matice 3 x 3 1 „sa potom obrácena (pomocí ~), který identifikuje všechny body, které nemají miny jako sousedy (1) nebo do (). K určení počtu připojených oblastí používáme bwlabel k označení každé připojené oblasti 1 „. Prvním výstupem je matice štítků (0 kde byl vstup nulový a libovolná hodnota v rozsahu 1...N kde byl 1 na vstupu, kde N je index připojené skupiny, do které patří). Druhým výstupem je počet oblastí (počet kliknutí nutných k jejich otevření). Výsledek bwlabel je zobrazen na obrázku vlevo.

zde zadejte popis obrázku

Rozšiřujeme první výstup bwlabel pomocí imdilate (všechny nuly jsou rozbaleny) pomocí matice 3 x 3 1 „s. Výsledek se zobrazí na obrázku uprostřed.

Abychom určili zbývající kliknutí, spočítáme čtverce, které nejsou v této rozšířené oblasti (~imdilate()) a ne důl (-x) (bílé čtverečky na obrázku vpravo) a přidejte to k celkovému počtu otevřených oblastí (počet různých barev na obrázku vlevo ) pro získání 3BV.

Odpověď

Octave, 86 84 79 66 bajtů

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

Toto řešení vytvoří anonymní funkci s názvem ans, která poté lze předat 2D matici 0 „sa 1“ s. Logika je stejná jako moje odpověď MATLABu, ale používá několik triků, které Octave nabízí, aby ušetřil místo.

Toto řešení vyžaduje, aby byl nainstalován balíček image .

Demo zde

Odpověď

MATL, 24 22 21 bajtů (nekonkurenční )

1 bajt uložen díky @Luis

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

Zkuste to na MATL Online

Vysvětlení

Opět je to podobné jako moje MATLAB a Octave odpovědi na tuto otázku.

 % 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 

Komentáře

  • Proč nekonkurovat?
  • @CalculatorFeline Funkce bwlabeln byla bohužel zavedena do MATL po výzva byla zveřejněna.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *