방문했던 알파벳을 다시 방문하면 안 되므로 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;
}