블로그 언저리인 무언가
[백준/BOJ] 17085 십자가 2개 놓기 본문
728x90
    
    
  문제 : 17085 십자가 2개 놓기
17085번: 십자가 2개 놓기
첫째 줄에 격자판의 크기 N, M (2 ≤ N, M ≤ 15)이 주어진다. 둘째 줄부터 N개의 줄에 격자판의 상태가 주어진다. 항상 두 개의 십자가를 놓을 수 있는 경우만 입력으로 주어진다.
www.acmicpc.net
N, M의 크기가 15밖에 안되므로 단순한 구현 문제이다.
모든 칸에 대해서 십자가 크기별로 넣어봐야 하는데
총 2개의 십자가를 배치해야 하므로 재귀 함수를 이용하면
코드의 길이를 단축해서 짤 수 있다.
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll N, M, ans;
ll dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
string arr[20];
ll f(ll x, ll y, ll depth){
    ll ret=0;
    for (int i=0;i<=7;i++){ // 십자가 변의 길이
        ll chk=1;
        for (int j=-i;j<=i;j++){ // 배치 가능한지 확인
            if (x+j<0 || x+j>=N || y+j<0 || y+j>=M || arr[x+j][y]!='#' || arr[x][y+j]!='#')
                chk=0;
        }
        if (chk){ 
            for (int j=-i;j<=i;j++){
                arr[x+j][y]='.';
                arr[x][y+j]='.';
            }
            if (depth) // 두번째 십자가라면 즉시 반환
                ret=i*4+1;
            else{ // 첫번째 십자가라면 한번더 탐색
                for (int j=0;j<N;j++){
                    for (int k=0;k<M;k++)
                        ret=max(ret,(i*4+1)*f(j,k,1));
                }
            }
            for (int j=-i;j<=i;j++){
                arr[x+j][y]='#';
                arr[x][y+j]='#';
            }
        }
        else
            break;
    }
    return ret;
}
int main(){
    cin >> N >> M;
    for (int i=0;i<N;i++)
        cin >> arr[i];
    for (int i=0;i<N;i++){
        for (int j=0;j<M;j++)
            ans=max(ans,f(i,j,0));
    }
    cout << ans;
    return 0;
}728x90
    
    
  'Programming > BOJ' 카테고리의 다른 글
| [백준/BOJ] 20365 블로그2 (0) | 2022.09.20 | 
|---|---|
| [백준/BOJ] 1025 제곱수 찾기 (0) | 2022.09.19 | 
| [백준/BOJ] 1022 소용돌이 예쁘게 출력하기 (0) | 2022.09.16 | 
| [백준/BOJ] 14948 군대탈출하기 (0) | 2022.09.16 | 
| [백준/BOJ] 20056 마법사 상어와 파이어볼 (1) | 2022.09.16 | 
			  Comments