-
[백준][3190번] 뱀Algorithm/백준 2020. 4. 19. 22:40
https://www.acmicpc.net/problem/3190
3190번: 뱀
문제 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임은 NxN 정사각 보드위에서 진행되고, 몇몇 칸에는 사과가 놓여져 있다. 보드의 상하좌우 끝에 벽이 있다. 게임이 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1 이다. 뱀은 처음에 오른쪽을 향한다. 뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따
www.acmicpc.net
풀이과정
1. 특별한 알고리즘없이 문제의 흐름대로 풀면 풀리는 문제였다.
2. 뱀의 길이가 계속 늘어 날 수 있어 vector를 이용하여 뱀의 위치 정보를 가졌다.
3. 뱀의 현재 위치를 담은 visited배열을 이용하여 "자신의 몸의 닿을 경우 게임은 종료된다." 를 체크했다.
결과
소스코드
더보기#include<stdio.h> #include<vector> #include<queue> using namespace std; int map[101][101]; int visited[101][101]; struct info { int t; char dir; }typedef info; struct dummy { int x; int y; int d; }typedef dummy; int dx[4] = { 1, 0 ,-1 ,0 }; int dy[4] = { 0, 1, 0, -1 }; vector<info> g_info; vector<dummy> g_dummy; int N, L, K; void changeDirection(char dir) { if (dir == 'L') //left 90' { g_dummy[0].d--; if (g_dummy[0].d < 0) { g_dummy[0].d = 3; } } else { g_dummy[0].d++; if (g_dummy[0].d > 3) { g_dummy[0].d = 0; } } } int solution() { int answer = 0; visited[0][0] = 1; info change = g_info[0]; g_info.erase(g_info.begin()); while (!g_dummy.empty()) { //자기 몸 또는 벽 answer++; int nx = g_dummy[0].x + dx[g_dummy[0].d]; int ny = g_dummy[0].y + dy[g_dummy[0].d]; if (nx < 0 || ny < 0 || nx >= N || ny >= N || visited[ny][nx] == 1) { return answer; } else { visited[ny][nx] = 1; if (map[ny][nx] == 1) { map[ny][nx] = 0; dummy next = { nx, ny, g_dummy[0].d }; g_dummy.insert(g_dummy.begin(), next); } else { dummy next = { nx, ny, g_dummy[0].d }; g_dummy.insert(g_dummy.begin(), next); dummy last = g_dummy.back(); visited[last.y][last.x] = 0; g_dummy.pop_back(); } } if (change.t == answer) { changeDirection(change.dir); if (g_info.size() > 0) { change = g_info[0]; g_info.erase(g_info.begin()); } } } } int main() { scanf("%d", &N); scanf("%d", &K); for (int i = 0; i < K; i++) { int x, y; scanf("%d %d", &y, &x); map[y-1][x-1] = 1; } scanf("%d", &L); for (int i = 0; i < L; i++) { int t; char ch; scanf("%d %c", &t, &ch); info tmp = { t, ch }; g_info.push_back(tmp); } dummy tmp = { 0, 0, 0 }; g_dummy.push_back(tmp); printf("%d\n", solution()); }
'Algorithm > 백준' 카테고리의 다른 글
[백준][13458번] 시험 감독 (0) 2020.04.20 [백준][14499번] 주사위 굴리기 (0) 2020.04.20 [백준][12100번] 2048 (Easy) (0) 2020.04.16 [백준][13460번] 구슬 탈출 2 (0) 2020.04.13 [백준][12851] 숨바꼭질2 (0) 2020.04.02