https://www.acmicpc.net/problem/1063

 

1063번: 킹

8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는

www.acmicpc.net

 

8 x 8 크기의 체스판이지만 A1, B5 등의 문자열로 취급이 된다.

숫자는 행, 알파벳은 열을 의미하기에 문자를 숫자로 바꾸는 법을 알아야한다.

아스키코드 값을 외울필요는 없다. (항상 까먹음..)

 

[문자 -> 숫자 변환]

'1' -> '1' - '0' = 1

'2' -> '2' - '0' = 2

 

(A가 1로 시작하기때문에 + 1을 해준다)

'A' -> 'A' - 'A' + 1 = 1

'B' -> 'B' - 'A' + 1 = 2

 

반대로는?

[숫자 -> 문자]

(행)

1 -> 1 + '0' = '1'

2 -> 2 + '0' = '2'

 

(열) (반대로 -1을 해줘야된다.)

1 -> 1 + 'A' - 1 = 'A'

2 -> 2 + 'A' - 1 = 'B'

 

이제 위의 방식대로 위치를 알 수 있게 되었다.

이제 행과 열이 1 <= 행, 열 <= 8 인 경우만 옮기게 해준다.

이동 가능한지 체크, 돌과 만나는지, 돌도 이동 가능한지 체크만 해주면 끝!

 

#include <iostream>
#include <string>

using namespace std;

const int SIZE = 8;

void GetPosition(string& pos, int& row, int& col)
{
	row = pos[1] - '0';
	col = pos[0] - 'A' + 1;
}

void GetDirection(char& command, int& dirRow, int& dirCol)
{
	switch (command)
	{
	case 'R':
		dirCol++;
		break;
	case 'L':
		dirCol--;
		break;
	case 'B':
		dirRow--;
		break;
	case 'T':
		dirRow++;
		break;
	default:
		break;
	}
}

bool IsValidPosition(int row, int col)
{
	return 0 < row && row <= SIZE &&
		0 < col && col <= SIZE;
}

void SetPosition(string& pos, int row, int col)
{
	pos[0] = 'A' + (col - 1);
	pos[1] = row + '0';
}

int main()
{
	string kingPosition, stonePosition, move;
	int moveCount, kingRow, kingCol, stoneRow, stoneCol;

	cin >> kingPosition >> stonePosition >> moveCount;

	GetPosition(kingPosition, kingRow, kingCol);
	GetPosition(stonePosition, stoneRow, stoneCol);
	
	for (int i = 0; i < moveCount; ++i)
	{
		int dirRow = 0, dirCol = 0;

		cin >> move;

		for (int j = 0; j < move.length(); ++j)
		{
			GetDirection(move[j], dirRow, dirCol);
		}

		if (IsValidPosition(kingRow + dirRow, kingCol + dirCol))
		{
			string preKingPosition = kingPosition;
			int preKingRow = kingRow;
			int preKingCol = kingCol;

			kingRow += dirRow;
			kingCol += dirCol;

			SetPosition(kingPosition, kingRow, kingCol);

			if (kingPosition == stonePosition)
			{
				if (IsValidPosition(stoneRow + dirRow, stoneCol + dirCol))
				{
					stoneRow += dirRow;
					stoneCol += dirCol;

					SetPosition(stonePosition, stoneRow, stoneCol);
				}
				else
				{
					kingPosition = preKingPosition;
					kingRow = preKingRow;
					kingCol = preKingCol;
				}
			}
		}
	}

	cout << kingPosition << " " << stonePosition << endl;
}

+ Recent posts