본문 바로가기
Programming/Algorithm

슬라이딩 퍼즐 - 움직임

by 작은별하나 2015. 2. 18.
반응형

 

슬라이딩 퍼즐의 자료구조를 잡는 것이 필요한데요.  제 경우에는 단순 배열로 작성을 했습니다.

 

	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

댓글