저도 아직 이 문제를 풀지 못해 여러 예제를 대입해보는 중인데용.
예시로 든 문제는 5번에 1024가 가능함을 확인하였습니다.
아래는 제 결과입니다.
---
initial
0 0 64 32 32 0 0 0 0 0
0 32 32 64 0 0 0 0 0 0
0 0 128 0 0 0 0 0 0 0
64 64 128 0 0 0 0 0 0 0
0 0 64 32 32 0 0 0 0 0
0 32 32 64 0 0 0 0 0 0
0 0 128 0 0 0 0 0 0 0
64 64 128 0 0 0 0 0 0 0
128 32 0 0 0 0 0 0 0 0
0 0 128 0 0 0 0 0 0 0
right
0 0 0 0 0 0 0 0 64 64
0 0 0 0 0 0 0 0 64 64
0 0 0 0 0 0 0 0 0 128
0 0 0 0 0 0 0 0 128 128
0 0 0 0 0 0 0 0 64 64
0 0 0 0 0 0 0 0 64 64
0 0 0 0 0 0 0 0 0 128
0 0 0 0 0 0 0 0 128 128
0 0 0 0 0 0 0 0 128 32
0 0 0 0 0 0 0 0 0 128
top
0 0 0 0 0 0 0 0 128 128
0 0 0 0 0 0 0 0 128 256
0 0 0 0 0 0 0 0 128 128
0 0 0 0 0 0 0 0 256 256
0 0 0 0 0 0 0 0 0 32
0 0 0 0 0 0 0 0 0 128
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
right
0 0 0 0 0 0 0 0 0 256
0 0 0 0 0 0 0 0 128 256
0 0 0 0 0 0 0 0 0 256
0 0 0 0 0 0 0 0 0 512
0 0 0 0 0 0 0 0 0 32
0 0 0 0 0 0 0 0 0 128
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
down
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 256
0 0 0 0 0 0 0 0 0 512
0 0 0 0 0 0 0 0 0 512
0 0 0 0 0 0 0 0 0 32
0 0 0 0 0 0 0 0 128 128
top
0 0 0 0 0 0 0 0 128 256
0 0 0 0 0 0 0 0 0 1024
0 0 0 0 0 0 0 0 0 32
0 0 0 0 0 0 0 0 0 128
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
hyeok5596 2년 전
질문 게시판에 올라온 대부분의 반례에 대해서는 정답이지만,
아래와 같은 반례를 발견했습니다.
10
0 0 64 32 32 0 0 0 0 0
0 32 32 64 0 0 0 0 0 0
0 0 128 0 0 0 0 0 0 0
64 64 128 0 0 0 0 0 0 0
0 0 64 32 32 0 0 0 0 0
0 32 32 64 0 0 0 0 0 0
0 0 128 0 0 0 0 0 0 0
64 64 128 0 0 0 0 0 0 0
128 32 0 0 0 0 0 0 0 0
0 0 128 0 0 0 0 0 0 0
answer : 1024
my result : 512
일단 위의 반례에서 최소 6번은 이동해야 1024라는 값을 얻어낼 수 있을 것 같은데
어떻게 5번 안에 1024라는 값을 얻어낼 수 있는지를 모르겠습니다.
그리고 아래와 같은 백트래킹 방식으로 구현했는데 어느 부분이 논리적으로 틀린 부분인지 찾을 수가 없습니다.
static void allMove(int[][] block, int moveCnt) {
if(moveCnt == 5)
return;
upMove(block, moveCnt);
downMove(block, moveCnt);
leftMove(block, moveCnt);
rightMove(block, moveCnt);
}
전체 소스 코드 첨부합니다.
도움 요청드립니다. 감사합니다.