PS

BOJ 20118 : 호반우가 길을 건너간 이유

lickelon 2025. 2. 13. 23:59
  • 문제 링크 : boj.kr/20118
  • 난이도 : G2
  • 태그 : 애드혹, 해 구성하기

코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int n, m;
    cin >> n >> m;
    vector<pii> ans;
    for(int i = 0; i < min(n,m); i++) {
        ans.emplace_back(i,i);
    }
    if(n < m) {
        for(int i = n; i < m; i++) {
            ans.emplace_back(n-1, i);
        }
    }
    else if(n > m) {
        for(int i = m; i < n; i++) {
            ans.emplace_back(i, m-1);
        }
    }
    if(ans.size() % 2) {
        ans.emplace_back(min(n,m)-2, min(n,m)-1);
    }
    sort(all(ans));

    cout << ans.size() * 2 << "\n";
    for(int i = 0; i < ans.size(); i += 2) {
        cout << ans[i].first << " " << ans[i].second << "\n";
        cout << ans[i+1].first << " " << ans[i+1].second << "\n";
        cout << ans[i].first << " " << ans[i].second << "\n";
        cout << ans[i+1].first << " " << ans[i+1].second << "\n";
    }

    return 0;
}

풀이

$A \oplus A=0$을 이용하는 문제이다.

A->B->A->B의 경로를 통해 XOR을 0으로 유지하면서 A에서 B로 나아갈 수 있다.

따라서 경로의 길이가 짝수라면 XOR을 0으로 유지한 채 끝점에 도달할 수 있다.

시작점에서 끝점까지 도달하는 길이가 짝수인 임의의 경로를 찾는다면 문제를 해결할 수 있다.

728x90