fork download
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <cstring>
  4.  
  5. using namespace std;
  6.  
  7. char board[5][5]; // 게임 보드판 알파벳 배열
  8. char word[10]; // 키워드 입력 배열
  9. int check[5][5][10]; // 글자별 확인여부 체크 [ x 좌표 ] [ y 좌표 ] [ 글자의 위치 ]
  10. int word_len; // 키워드의 길이
  11. const int dx[8] = { -1,-1,-1, 0, 1, 1, 1, 0 }; // ↖ 방향부터 시계 방향으로 진행
  12. const int dy[8] = { -1, 0, 1, 1, 1, 0,-1,-1 };
  13.  
  14. int solution(int x, int y, int ptr)
  15. {
  16. if (x < 0 || x >= 5 || y < 0 || y >= 5) return 0; // 범위 초과시 실패
  17. if (check[x][y][ptr]) return 0; // 이미 확인한 것이면 실패
  18. check[x][y][ptr] = 1; // 확인하지 않았으므로 1로 초기화
  19.  
  20. if (board[x][y] != word[ptr]) return 0; // 보드판의 글자와 키워드의 해당 글자가 일치하지않으면 실패
  21. if (ptr == word_len - 1) return 1; // 바로 위에서 글자 검사에서 통과했기에 글자의 마지막 위치라면 성공
  22.  
  23. for (int i = 0; i < 8; i++) //인접한 8칸 검사
  24. {
  25. int result = solution(x + dx[i], y + dy[i], ptr + 1); // ↖ 방향부터 시계 방향으로 진행
  26. if (result) return 1; // 참이라면 성공
  27. }
  28. return 0; // 거짓이라면 실패
  29. }
  30.  
  31. int main(void)
  32. {
  33. int test_case;
  34. cin >> test_case;
  35.  
  36. while (test_case--)
  37. {
  38. memset(board, 0, sizeof(board)); // board의 배열을 0으로 초기화
  39.  
  40. for (int i = 0; i < 5; i++) cin >> board[i];
  41.  
  42. int word_num;
  43. cin >> word_num;
  44.  
  45. while (word_num--)
  46. {
  47. memset(check, 0, sizeof(check)); // check의 배열을 0으로 초기화
  48. cin >> word;
  49. word_len = strlen(word);
  50. int out = 0; // 중첩 반복문 빠져나오는 키워드
  51.  
  52. for (int i = 0; i < 5; i++)
  53. {
  54. for (int j = 0; j < 5; j++)
  55. {
  56. if (solution(i, j, 0))
  57. {
  58. out = 1;
  59. break;
  60. }
  61. }
  62. if (out) break;
  63. }
  64. if (out) printf("%s YES\n", word);
  65. else printf("%s NO\n", word);
  66. }
  67. }
  68. return 0;
  69. }
Success #stdin #stdout 0s 4356KB
stdin
1
URLPM
XPRET
GIAET
XTNZY
XOQRS
6
PRETTY
GIRL
REPEAT
KARA
PANDORA
GIAZAPX
stdout
PRETTY YES
GIRL YES
REPEAT YES
KARA NO
PANDORA NO
GIAZAPX YES