알고리즘/알고리즘 문제풀이

1063번: 킹

b1ackhand 2022. 2. 5. 21:26

2022.02.05

 

문제 출처:

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

 

문제 분석:

킹과 돌맹이를 주어진 방향에 따라 움직이는 문제이다.

킹이 움직이는 방향에 돌맹이가 있으면 같이 밀린다.

필요한 요구사항에 따라 구현 하면 될듯 하다.

 

문제 해결:

처음에 주어진 좌표를 숫자좌표로 바꾸고 

킹이 움직이는 방향을 돌맹이와의 상대좌표와 비교해서 같이 움직이는지 안움직이는지를 확인한다.

그리고 체스판 제한을 확인하며 움직여 준다.

 

내 소스코드:

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef vector<int> vi;

const int INF = 987654321;

int arr[8][8];
pii dol;
pii king;
int dX[8] = {0, 1, 1, 1, 0, -1, -1, -1};
int dY[8] = {1, 1, 0, -1, -1, -1, 0, 1};

int converter(string a)
{
   if (a == "T")
      return 0;
   else if (a == "RT")
      return 1;
   else if (a == "R")
      return 2;
   else if (a == "RB")
      return 3;
   else if (a == "B")
      return 4;
   else if (a == "LB")
      return 5;
   else if (a == "L")
      return 6;
   else if (a == "LT")
      return 7;

   return 0;
}

int main()
{
   ios_base::sync_with_stdio(false);
   cin.tie(NULL);
   cout.tie(NULL);

   memset(arr, 0, sizeof(arr));

   string a, b;
   int c;

   cin >> a >> b >> c;

   king = make_pair((int)(a[0] - 'A'), (int)(a[1] - '0' - 1));
   dol = make_pair((int)(b[0] - 'A'), (int)(b[1] - '0' - 1));

   while (c--)
   {
      bool check = false;

      cin >> a;
      int order = converter(a);
      int qX = dX[order];
      int qY = dY[order];

      // cout << qX << qY << "\n";

      if (dol.F - king.F == qX && dol.S - king.S == qY)
         check = true;

      if (check)
      {
         int nX = king.F + qX;
         int nY = king.S + qY;
         int dolX = dol.F + qX;
         int dolY = dol.S + qY;

         if (nX < 0 || nY < 0 || nX >= 8 || nY >= 8)
            continue;

         if (dolX < 0 || dolY < 0 || dolX >= 8 || dolY >= 8)
            continue;

         king = {nX, nY};
         dol = {dolX, dolY};
      }
      else
      {
         int nX = king.F + qX;
         int nY = king.S + qY;

         if (nX < 0 || nY < 0 || nX >= 8 || nY >= 8)
            continue;

         king = {nX, nY};
      }

      // cout << c << "\n"
      //      << (char)(king.F + 'A') << king.S << "\n"
      //      << (char)(dol.F + 'A') << dol.S << "\n";
   }

   cout << (char)(king.F + 'A') << king.S + 1 << "\n"
        << (char)(dol.F + 'A') << dol.S + 1;

   return 0;
}

고찰: 

잘 구현해냈다.

'알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글

Codeforces Round #790 (Div. 4) - A  (0) 2022.05.15
21922번: 학부 연구생 민상  (0) 2022.02.14
10164번: 격자상의 경로  (0) 2022.02.03
2539번: 모자이크  (0) 2022.01.24
2437번: 저울  (0) 2022.01.23