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;
}
'Algorithm > Baekjoon Online Judge' 카테고리의 다른 글
[백준 문제 C++] 엄청난 부자2 (0) | 2022.03.14 |
---|---|
[백준 문제 C++] 2618 경찰차 (0) | 2022.01.12 |
[백준 문제 C++] 1074 Z (0) | 2021.08.30 |
[백준 문제 C++] 1707 이분 그래프 (0) | 2021.08.26 |
[백준 문제 C++] 1193 분수찾기 (0) | 2021.08.24 |