(a) 5x5 알파벳 격자1
U | R | L | P | M |
X | P | R | E | T |
G | I | A | E | T |
X | T | N | Z | Y |
X | O | Q | R | S |
이러한 알파벳 격자를 이용하여 상하좌우/대각선으로 인접한 칸들의 글자를 이어서 단어를 찾아내는 게임
(b)단어 1 .PRETIY
. | . | . | . | . |
. | P | R | . | T |
. | . | . | E | T |
. | . | . | . | Y |
. | . | . | . | . |
(c)단어 2 .GIRLE
. | . | L | . | . |
. | . | R | . | . |
G | I | . | . | . |
. | . | . | . | . |
. | . | . | . | . |
(d)단어 3 .REPEAT
. | . | . | P | . |
. | . | R | E | . |
. | . | A | . | . |
. | T | . | . | . |
. | . | . | . | . |
(e) 5x5 알파벳 격자2
N | N | N | N | S |
N | E | E | E | N |
N | E | Y | E | N |
N | E | E | E | N |
N | N | N | N | N |
(e)에서 YES를 찾고 싶을땐? 여기서 YES로 연결되는 E는 오른쪽 위 칸 하나.
Y에서 인접한 E만 살펴보면 어느 E를 따라가야 답을 찾을 수 있는 지 알 수 없으므로 완전탐색을 이용함.
const int dx[8] = { -1, -1, -1 , 1, 1, 1, 0, 0};
const int dy[8] = { -1, 0, 1, -1, 0, 1, -1, 1);
bool hasWord(int y, int x, const string& word){
// 시작 위치가 범위 밖이면 무조건 실패
if(!inRange(y, x)) return false;
// 첫 글자가 일치하지 않으면 실패
if(board[y][x] != word[0]) return false;
//단어 길이가 1이면 성공
if(word.size() == 1) return true;
//인접한 여덟 칸을 검사
for(int direction = 0; direction < 8; ++direction){
int nextY = y + dy[direction], nextX = x+ dx[direction];
//다음 칸이 범위 안에 있는지, 첫 글자는 일치하는지를 확인할 필요가 없음
if(hasWord(nextY, nextX, word.substr(1)))
return true;
}
return false;
}