하..... 변수형은 int로 써야하는걸 char로 써서 1시간을 날렸다. 오류 찾느라..... 디버깅 모드 할때 어쩐지 100 'd' 일케 되있더라 뭐지 했는데 결국 자료형의 값을 넘어서서 -127로 변해서 그런거였다. ..... 자료형 잘보자...... 그리고 코드 최적화 하자.
#include#include #include #include using namespace std; typedef struct { int time; char dir; }time_dir_info; typedef struct { int apple_po_x; int apple_po_y; }apple_po_info; typedef struct { int position_x; int position_y; int dir; }snake; enum direction{ UP = 0, DOWN, LEFT, RIGHT }; typedef struct { int pos_x; int pos_y; }snake_length_detail; int N, apple_n; int map[100][100]; int apple_po_x, apple_po_y; int snake_change_n, time, total_time; char dir, cur_dir; int cur_time; queue q; vector v; queue q_s_d; int dirx[4] = {0,0,-1, 1}; int diry[4] = {-1,1,0,0}; snake s; void Input() { scanf("%d %d", &N, &apple_n); for (int i = 0; i < apple_n; i++) { scanf("%d %d", &apple_po_y, &apple_po_x); v.push_back({ apple_po_x-1, apple_po_y-1 }); } scanf("%d", &snake_change_n); for (int i = 0; i < snake_change_n; i++) { scanf("%d %c", &time, &dir); q.push({ time, dir }); } s.position_x = 0; s.position_y = 0; s.dir = RIGHT; map[0][0] = 1; q_s_d.push({ s.position_x,s.position_y }); } bool apple_check(int position_x, int position_y) { vector ::iterator iter; for (iter = v.begin(); iter != v.end(); ++iter) { if ((*iter).apple_po_x == position_x && (*iter).apple_po_y == position_y) { v.erase(iter); return true; } } return false; } void modify_position(bool flag) { int pos_x = q_s_d.front().pos_x; int pos_y = q_s_d.front().pos_y; q_s_d.pop(); map[pos_y][pos_x] = 0; } bool modify_length(int dir) { if (map[s.position_y + diry[dir]][s.position_x + dirx[dir]] == 1) return false; if (!apple_check(s.position_x+dirx[dir], s.position_y+diry[dir])) { modify_position(true); } s.position_x += dirx[dir]; s.position_y += diry[dir]; map[s.position_y][s.position_x] = 1; q_s_d.push({ s.position_x, s.position_y }); return true; } void change_dir(int dir) { switch (s.dir) { case UP: if (dir == 'D') s.dir = RIGHT; else s.dir = LEFT; break; case DOWN: if (dir == 'D') s.dir = LEFT; else s.dir = RIGHT; break; case LEFT: if (dir == 'D') s.dir = UP; else s.dir = DOWN; break; case RIGHT: if (dir == 'D') s.dir = DOWN; else s.dir = UP; break; default: break; } } void time_dir_check(int total_time) { if (cur_time == total_time) { change_dir(cur_dir); if (!q.empty()) { cur_time = q.front().time; cur_dir = q.front().dir; q.pop(); } } } void Calc() { if (q.size() > 0) { cur_time = q.front().time; cur_dir = q.front().dir; q.pop(); } while (true) { if (s.position_x < 0 || s.position_y < 0 || s.position_x >= N || s.position_y >= N) return; total_time++; if (!modify_length(s.dir)) return; time_dir_check(total_time); } } void Solve() { Input(); Calc(); printf("%d", total_time); } int main(void) { Solve(); return 0; }