#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
using namespace std;
int n, m;
int dx[] = {-1,-1,-1,1,1,1,0,0};
int dy[] = {-1,0,1,-1,0,1,-1,1};
vector <int>visit;
string board[5];
bool findword(const string& s, int x, int y ) {
//s.substr(1) 로 인해서 재귀를 한번 할때마다 첫번째 글자가 다음 글자로 바뀜
if (board[x][y] != s[0]) return false;
if (s.size() == 1) return true;//비교할 글자가 한글자가 되면 탈출
for (int i = 0;i < 8;i++) {//상하좌우대각선 8방향 검사
int nextx = x + dx[i];
int nexty = y + dy[i];
if (0 <= nextx && nextx < 5 && 0 <= nexty && nexty < 8) {
if(findword(s.substr(1), nextx, nexty))
return true;
}
}
return false;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n; // 테스트 케이스
for (int i = 0;i < n;i++) {
for (int j = 0; j < 5;j++) {
cin >> board[j];
}
int N;
cin >> N;
for (int a = 0;a < N;a++) {
string s;
cin >> s;
bool Check = false;
for (int b = 0;b < 5; b++) {
for (int c = 0;c < 5; c++) {
if (board[b][c] == s[0]) //보드판을 돌면서 첫번째 숫자랑 같은거만 일단 시작하기 때문에
{
Check = findword(s, b, c);
if (Check)break;
}
if (Check)break;
}
}
if (Check)
cout << s << " " << "YES\n";
else
cout << s << " " << "NO\n";
}
}
return 0;
}
이 문제는 흔하게 완전탐색에서 쓰이는 visit 체크를 하지 않는다. 한번 지나간것도 또 지나갈 수 있기 때문인데 이렇게 가지치기를 하지 않는 문제기 때문에 위의 코드로 자신의 컴퓨터에서 돌리면 돌아가지만 알고스팟에 제출하면 시간이 부족해서 되지 않는다.
추후에 배울 메모이제이션을 사용하면 시간 초과없이 통과한다고 한다.
나중에 따로 코드를 작성해서 올리겠다.
반응형
'알고리즘' 카테고리의 다른 글
프로그래머스 - 리코쳇 로봇 (0) | 2024.08.11 |
---|---|
프로그래머스 - 신고 결과 받기 (0) | 2022.03.21 |
1이 될때까지 최소 연산 횟수 (0) | 2021.08.21 |
알고스팟 - 소풍 (0) | 2020.06.15 |
프로그래머스 - 네트워크 (0) | 2020.04.19 |
프로그래머스 - 다리를 지나는 트럭 (0) | 2020.04.19 |
프로그래머스 - 가장 큰 수 (0) | 2020.04.13 |
프로그래머스 - 정수 삼각형 (0) | 2020.04.12 |