henry1214 2021. 6. 7. 10:35

https://algospot.com/judge/problem/read/BOGGLE

 

algospot.com :: BOGGLE

보글 게임 문제 정보 문제 보글(Boggle) 게임은 그림 (a)와 같은 5x5 크기의 알파벳 격자인 게임판의 한 글자에서 시작해서 펜을 움직이면서 만나는 글자를 그 순서대로 나열하여 만들어지는 영어

algospot.com

 

cache[x][y][idx]를 이용해서 현재 위치 (x,y)에서 idx까지 탐색했을 때 중복 탐색 여부를 확인해준다. 그러면 탐색 가지수를 줄일 수 있다.

 

#include <cstdio>
#include <cstring>

int t,n,len;
char map[7][7],s[15];
int cache[5][5][10];
int dx[8]={-1,-1,-1,0,0,1,1,1};
int dy[8]={-1,0,1,-1,1,-1,0,1};

bool go(int x,int y,int idx)
{
    if(x<0 || x>4 || y<0 || y>4 || cache[x][y][idx] || map[x][y]!=s[idx])
        return false;
    cache[x][y][idx]=1;
    if(idx==len-1)
        return true;
    for(int i=0;i<8;i++)
        if(go(x+dx[i],y+dy[i],idx+1))
            return true;
    return false;
}

bool find()
{
    for(int i=0;i<5;i++)
        for(int j=0;j<5;j++)
            if(go(i,j,0))
                return true;
    return false;
}

int main()
{
    scanf("%d",&t);
    while(t--)
    {
        for(int i=0;i<5;i++)
            scanf("%s",map[i]);
        scanf("%d",&n);
        while(n--)
        {
            scanf("%s",s);
            len=strlen(s);
            memset(cache,0,sizeof(cache));
            printf("%s %s\n",s,find()?"YES":"NO");
        }
    }
    return 0;
}