알고리즘/koitp

koitp SDS_TEST_SPACE 순환공간

꾸준함. 2018. 7. 27. 02:24

문제 링크입니다: https://koitp.org/problem/SDS_TEST_SPACE/read/


별도의 알고리즘을 요구하지 않는 쉬운 문제였습니다.


총 9가지의 경우를 고려해줘야합니다.

1. S에서 E로 바로 가는 경우

2. S의 x 좌표가 0을 지나 M-1로 가는 경우

3. S의 x 좌표가 M-1을 지나 0으로 가는 경우

4. S의 y 좌표가 0을 지나 N-1로 가는 경우

5. S의 y 좌표가 N-1을 지나 0으로 가는 경우

6. 2번 + 4번

7. 2번 + 5번

8. 3번 + 4번

9. 3번 + 5번


#include <iostream>

#include <algorithm>

using namespace std;

 

int main(void)

{

        ios_base::sync_with_stdio(0);

        cin.tie(0); //cin 속도 향상

        int test_case;

        cin >> test_case;

 

        for (int i = 1; i <= test_case; i++)

        {

                 int N, M;

                 pair<int, int> start;

                 pair<int, int> finish;

 

                 cin >> N >> M;

                 cin >> start.first >> start.second;

                 cin >> finish.first >> finish.second;

 

                 int result;

                 //그냥 좌표 그대로

                 int candidate1 = abs(start.first - finish.first) + abs(start.second - finish.second);

                 //y N-1 -> 0

                 int candidate2 = (N - start.first) + finish.first + abs(start.second - finish.second);

                 result = min(candidate1, candidate2);

                 //y 0 -> N-1

                 int candidate3 = (start.first + 1) + abs(finish.first - (N - 1)) + abs(start.second - finish.second);

                 result = min(result, candidate3);

                 //x M-1 -> 0

                 int candidate4 = abs(start.first - finish.first) + (M - start.second) + finish.second;

                 result = min(result, candidate4);

                 //x 0 -> M-1

                 int candidate5 = abs(start.first - finish.first) + (start.second + 1) + abs(finish.second - (M - 1));

                 result = min(result, candidate5);

                 //y N-1 -> 0

                 //x M-1 -> 0

                 int candidate6 = (N - start.first) + finish.first + (M - start.second) + finish.second;

                 result = min(result, candidate6);

                 //y N-1 -> 0

                 //x 0 -> M-1

                 int candidate7 = (N - start.first) + finish.first + (start.second + 1) + abs(finish.second - (M - 1));

                 result = min(result, candidate7);

                 //y 0 -> N-1

                 //x M-1 -> 0

                 int candidate8 = (start.first + 1) + abs(finish.first - (N - 1)) + (M - start.second) + finish.second;

                 result = min(result, candidate8);

                 //y 0 -> N-1

                 //x 0 -> M-1

                 int candidate9 = (start.first + 1) + abs(finish.first - (N - 1)) + (start.second + 1) + abs(finish.second - (M - 1));

                 result = min(result, candidate9);

 

                 cout << "#" << i << " " << result << "\n";

        }

        return 0;

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


반응형