반응형
슬라이딩 퍼즐의 자료구조를 잡는 것이 필요한데요. 제 경우에는 단순 배열로 작성을 했습니다.
char *squares;
int emptySquare;
squares 변수는 1차원 배열로, 2차원 배열을 따로 복잡하게 구성하지 않았습니다. 사실 C/C++ 언어에서 단순 배열은 모두 1차원 배열로 인식을 합니다. 형식만 2차원, 3차원이 되는 것 뿐이죠. emptySquare는 어떤 칸이 비어있는지를 나타냅니다. 해당 칸은 0이란 값을 적게 됩니다.
이 자료구조를 토대로 움직임 함수를 구현한 것입니다.
bool Move(PuzzleParams *param, eMove move)
{
int newEmptySquare = Move(param->squares, param->rows, param->cols, param->emptySquare, move);
if(param->emptySquare != newEmptySquare)
{
param->emptySquare = newEmptySquare;
return true;
}
return false;
}
int Move(char *squares, int rows, int cols, int emptySquare, eMove move)
{
int row = emptySquare/cols;
int col = emptySquare%cols;
int newEmptySquare = emptySquare;
if( row < rows-1 && move == MoveUp ) newEmptySquare += cols;
else if( col > 0 && move == MoveRight ) newEmptySquare -= 1;
else if( row > 0 && move == MoveDown ) newEmptySquare -= cols;
else if( col < cols-1 && move == MoveLeft ) newEmptySquare += 1;
if( emptySquare != newEmptySquare )
{
squares[emptySquare] = squares[newEmptySquare];
squares[emptySquare = newEmptySquare] = 0;
}
return emptySquare;
}
Move 함수는 두가지로 만들었습니다. 이유는 초기에 어플리케이션단에서 호출하기 위한 것과 내부적으로 사용하는 용도입니다. 2차원 배열을 사용한다면 비어있는 칸을 찾기 위해서 나누기와 나머지 연산을 하지 않아도 되지만, 대체적으로 그 이후는 오히려 1차원 배열을 바로 사용하는 것이 더 바람직하다고 생각합니다.
실제로 움직일 수 있는가 없는가는 미리 판단하지 않도록 하였습니다. 움직인 후에 빈 칸의 위치가 바뀌었다면, 움직임이 존재했던 것이고, 그렇지 않다면, 여러 이유 때문에 움직이지 못 한 것이니까요.
728x90
'Programming > Algorithm' 카테고리의 다른 글
프로젝트 오일러 사이트 친구 등록 (0) | 2015.04.05 |
---|---|
슬라이딩 퍼즐 - A* 알고리즘으로 풀기 (35) | 2015.02.18 |
슬라이딩 퍼즐 풀기 - 기본편 (0) | 2015.02.13 |
A* 알고리즘을 이용한 하노이 타워 풀기 (0) | 2014.12.11 |
A* 알고리즘을 위한 우선순위 큐 구현 (0) | 2014.12.08 |
댓글