BOJ1987

방문했던 알파벳을 다시 방문하면 안 되므로 backtracking을 하면서 이를 저장해줘야 하는데, 비트마스킹을 사용하면 깔끔하게 처리할 수 있다. 굳이 사용하지는 않아도 되나, 비트마스킹 기초 연습으로 풀기에 좋은 문제인 듯 하다.

#include<bits/stdc++.h>
using namespace std;

#define ORD(x) (x-'A')

const int dx[] = { 0, 0,-1, 1};
const int dy[] = {-1, 1, 0, 0};

int R,C;
string arr[20];

int vpos(int x,int y){
    return x>=0&&x<R&&y>=0&&y<C;
}

int mx=0;

void f(int x,int y,int vis){
    mx = max(mx,__builtin_popcount(vis));
    for(int i=0;i<4;i++){
        int nx,ny;
        nx = x+dx[i];
        ny = y+dy[i];
        if(!vpos(nx,ny))continue;
        if(vis&(1<<ORD(arr[nx][ny])))continue;
        f(nx,ny,vis|(1<<ORD(arr[nx][ny])));
    }
}

int main(void){
    ios::sync_with_stdio(0);cin.tie(0);
    cin>>R>>C;
    for(int i=0;i<R;i++)cin>>arr[i];
    f(0,0,(1<<ORD(arr[0][0])));
    cout<<mx;
}
yubin.choi's profile image

최유빈(yubin.choi)

2021-04-11 00:00

Read more posts by this author