PS

BOJ 1846 : 장기

lickelon 2024. 3. 8. 16:24
  • 문제 링크 : boj.kr/1846
  • 난이도 : G4
  • 태그 : 해 구성하기
 

1846번: 장기

N개의 줄에 걸쳐, 게임판에서 각 줄의 몇 번째 칸에 차를 배치했는지를 나타내는 칸의 번호를 순서대로 출력한다. 조건을 만족시키는 배치가 둘 이상이면 아무 것이나 출력한다. 배치가 불가능

www.acmicpc.net


코드

#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;
    cin >> n;
    if(n == 3) {
        cout << -1;
        return 0;
    }
    
    int i = 1;
    for(; i < (n+1) / 2; i++) {
        cout << i+1 << "\n";
    }
    cout << "1\n" << n << "\n";
    for(; i < n-1; i++) {
        cout << i+1 << "\n";
    }

    return 0;
}

풀이

대각선에 놓을 수 없으면 대각선에 최대한 붙여서 놓으면 되는 거 아닌가? 에서 시작한 풀이이다.

 

대각선은 사각형을 네 부분으로 나눈다.

여기서 윗 부분은 왼쪽 대각선에, 아랫 부분은 오른쪽 대각선에 붙여서 말을 배치해보자.

N의 홀짝에 상관없이 가운데 두 줄에 말을 놓을 수 없게 된다.

이 두 줄에는 첫 번째 칸과 N번째 칸에 놓으면 쉽게 말을 놓을 수 있다.

'PS' 카테고리의 다른 글

BOJ 2187 : 점 고르기  (0) 2024.03.10
BOJ 1885 : 비부분수열  (0) 2024.03.09
BOJ 1540 : 정사각형의 개수  (0) 2024.03.07
BOJ 1304 : 지역  (0) 2024.03.06
BOJ 1286 : 부분 직사각형  (1) 2024.03.05