본문 바로가기
알고리즘/BOJ

BOJ 15705 ) 단어 찾기 (C++)

by twinkite 2022. 6. 19.
반응형

https://www.acmicpc.net/problem/15705

 

15705번: 단어 찾기

N×M 크기의 표의 각 칸에 알파벳 대문자가 하나씩 쓰여 있다. 단어 S가 주어졌을 때, 표에 단어 S가 있는지 없는지 구하는 프로그램을 작성하시오. 단어 S가 표에 존재하려면, 표의 한 칸에서 시작

www.acmicpc.net

 모든 경우를 다 시도해보면 되는 간단한 문제다. 단어의 첫 문자와 배열에 저장된 문자가 같으면 거기서부터 탐색을 시작한다. search 함수에서 시작점으로부터 어느 방향으로 탐색을 진행할지를 정하고, dfs 함수를 호출해 해당 방향으로 계속해서 탐색을 진행한다. 마지막 문자까지 일치하면 true를 반환하고 종료한다. 

#include <iostream>
#include <string>
#define pii pair<int,int>
#define x first
#define y second
using namespace std;
int dx[8]={0,0,1,-1,1,1,-1,-1};
int dy[8]={1,-1,0,0,-1,1,-1,1};

string s;
int N, M;

string arr[100];

bool dfs(int curx, int cury, int cnt, int dir){
    if(cnt == s.size()) return true;
    int nx = curx+dx[dir];
    int ny = cury+dy[dir];
    if(nx<0||ny<0||nx>=N||ny>=M) return false;
    bool chk = false;
    if(arr[nx][ny]==s[cnt]){
        chk = dfs(nx,ny, cnt+1, dir);
    }
    return chk;
}

bool search(int curx, int cury){
    for(int i=0;i<8;i++){
        if(dfs(curx, cury, 1, i)) return true;
    }
    return false;
}

int main(){
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    cin>>s;
    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++){
            if(arr[i][j]==s[0]){
                if(search(i,j)){
                    cout<<1;
                    return 0;
                }
            }
        }
    }
    cout<<0;
    return 0;
}
반응형

'알고리즘 > BOJ' 카테고리의 다른 글

BOJ 3273 ) 두 수의 합 (C++)  (0) 2024.07.17
BOJ 15738 ) 뒤집기 (C++)  (0) 2022.06.20
BOJ 3190 ) 뱀 (C++)  (0) 2022.06.16
BOJ 5921 ) Escaping the Farm (C++)  (0) 2022.06.13
BOJ 18877 ) Social Distancing (C++)  (0) 2022.06.10