Rätblocket | 프로그래밍의 벗 PivotOJ
PivotOJ

Rätblocket

시간 제한: 1000ms메모리 제한: 512MB출처: Programmeringsolympiaden 2016 — skolkvalBOJ 21284
이 문제는 본문 이미지 일부가 표시되지 않습니다. 텍스트만으로 풀이가 어려울 수 있습니다.

문제

Rätblocket är ett mobilspel som snabbt har blivit otroligt populärt. Spelet går ut på att man genom att vinkla mobilen åt olika håll ska få ett rätblock att rulla från cell AA till cell BB på en bana. Rätblocket har storlek 11x11x22 och banan är ett tvådimensionellt bräde med celler av storlek 11x11. Vissa celler är fria, vilket betyder att rätblocket kan röra sig fritt på dem, medan vissa celler är blockerade. Det är inte möjligt att röra sig utanför banan.

Beroende på om rätblocket står upp eller ligger ner så ockuperar det 11 eller 22 celler. I början av spelet så står blocket upp i cellen markerad med ett AA och målet är att flytta det så att det står i cellen markerat med ett BB (det räcker alltså inte med att halva blocket ligger på cell BB). En förflyttning av blocket kan göras i 44 olika riktningar - upp, ner, höger eller vänster - och en förflyttning gör att blocket rullar över i den givna riktningen (givet att det inte är en blockerad cell i vägen eller banan tar slut). För att tydligare visa hur en förflyttning går till så är här början på en lösning till exempelfall 11:

[이미지 1]  [이미지 2]  [이미지 3]  [이미지 4]  [이미지 5]

Figur 4. Halva lösningen till det första exempelfallet. Rätblocket flyttas först ett steg till höger, sedan två steg nedåt och till sist ett steg åt vänster.

På mer avancerade banor så förekommer även så kallade modulo-celler. Dessa är celler som kan befinna sig i två olika tillstånd, 00 eller 11. I tillstånd 00 så beter sig en modulo-cell precis som en fri cell som rätblocket kan röra sig på. I tillstånd 11 så är dock modulo-celler upphöjda och beter sig som blockerade celler. Det kan även finnas växel-celler (markerade med ett cc) utplacerade på banan. När rätblocket ställs på en växel-cell så ändras tillstånden på alla modulo-celler (00 blir till 11 och vice versa).

[이미지 6]  [이미지 7]

Figur 5. Det tredje exempelfallet, före och efter att växeln har aktiverats.

Banorna är designade så att det alltid finns en giltig lösning. Din uppgift är att beräkna det minsta antal förflyttningar som behövs för att lösa en bana.

입력

Du kommer först att få två heltal NN och MM. Detta betyder att banan har NN rader och MM kolumner. De följande NN raderna har MM tecken var och beskriver hur banan ser ut. Följande tecken kan förekomma:

  • AA eller BB: beskriver banans start- respektive slut-positioner.
  • . (en punkt): beskriver en fri cell.
  • #: beskriver en blockerad cell.
  • 00 eller 11: beskriver en modulo-cell med givet start-tillstånd.
  • c: beskriver en växel-cell

Det är garanterat att varje bana innehåller precis ett AA och ett BB.

출력

Skriv ut en rad med ett heltal, det minsta antal förflyttningar som behövs för att flytta rätblocket från cell AA till cell BB.

예제

예제 1

입력
3 3
A..
...
..B
출력
8

예제 2

입력
3 5
A#...
.....
...#B
출력
14

예제 3

입력
3 7
A..#...
.B.1...
..c#...
출력
27
코드를 제출하려면 로그인하세요.