250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- N과M
- 정보처리기사
- 에라토스테네스의채
- 주사위굴리기2
- D드라이브생성
- 자바
- java
- 완탐
- 백준
- 코테준비
- 삼성역테
- 백준15652
- Bfs와DFS
- 23288
- 백준2251
- 백준13458
- BFS
- 순열
- 자바 코테
- 재귀함수
- 알고리즘
- 완전탐색
- 정올 1620
- 전화번호속의암호
- 알고리즘개념
- 중복조합
- 코테
- 중복순열
- 볼륨 만들기
- 파티션 크기 조정
Archives
- Today
- Total
뚱땅뚱땅
[알고리즘] 알고스팟 BOGGLE문제 본문
728x90
알고리즘 문제 해결 전략 - BOGGLE 문제
재귀 함수 이용
#include <iostream>
#include <string>
#include <vector>
using namespace std;
const int dx[8] = {-1,-1,-1,0,0,1,1,1};
const int dy[8] = {-1,0,1,-1,1,-1,0,1};
char board[5][5];
bool hasWord(int y, int x, const string& word);
bool isRange(int y, int x);
int main() {
int testcase;
// char board[5][5];
string board_sentence;
int howmany_word;
vector<string> words;
string temp;
cin>> testcase;
for (int i = 0; i < testcase; i++) {
//게임판 생성
for (int m=0; m < 5; m++) {
cin>> board_sentence;
for (int n = 0; n < 5; n++) {
board[m][n] = board_sentence.at(n);
}
}
cin>>howmany_word;
// 검사할 단어들 벡터에 삽입
for (int i = 0; i < howmany_word; i++) {
cin >> temp;
words.push_back(temp);
}
for (vector<string>::iterator itr = words.begin(); itr != words.end(); ++itr) {
temp = *itr;
bool check = false;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (hasWord(i, j, temp)) {
check = true;
break;
}
}
}
if (check == true) {
temp += " YES";
}
else {
temp += " NO";
}
cout<<temp<<endl;
}
}
}
bool hasWord(int y, int x, const string& word) {
//base case1 : 시작 위치가 범위 밖이면 실패
if (!isRange(y, x)) return false;
//base case2 : 첫 글자가 일치하지 않으면 실패
if (board[y][x] != word[0]) return false;
// base case3: 단어 길이가 1이면 성공
if (word.size() == 1) return true;
//인접한 8칸 검사
for (int direction=0; direction < 8; direction++) {
int nextY = y + dy[direction];
int nextX = x + dx[direction];
if (hasWord(nextY, nextX, word.substr(1))) {
return true;
}
}
return false;
}
bool isRange(int y, int x) {
if (y >= 5) return false;
else if (y < 5 && y >= 0) {
if (x >= 5) return false;
else if (x < 5 && x >= 0) return true;
else return false;
}
else if (y < 0) return false;
}
728x90
'아카이브' 카테고리의 다른 글
[2020 정보처리기사 필기] 2.1.35 데이터저장소/데이터베이스/DBMS (0) | 2020.03.27 |
---|---|
[2020 정보처리기사 필기] 2.1.34 자료구조 (0) | 2020.03.27 |
[알고리즘] 알고스팟 PICNIC 문제 (0) | 2020.03.27 |
[Android Studio] ‘cannot resolve symbol’ error (0) | 2020.02.13 |
[Flutter] 기본 개념 + 예제 코드 작성 (0) | 2020.01.10 |
Comments