*map[x][y] == 0 : 일반땅
== 2 : 사과
== 1 : 뱀
1. 방향에대한 정보를 dir 에 저장하고 방향전환함수 turn을 만들어, 주어진 시간에 대해 방향전환이 필요할 경우 방향전환 시킴
2. 방향에 따라 x,y값 변화 시킴
3. 이동할 곳이 벽이거나 몸통인경우 종료
4. 이동할 곳이 일반땅인 경우 뱀의 꼬리부분 삭제
5. 뱀의 머리부분 추가 및 맵에 갱신
6. 종료시까지 반복
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | #include <iostream> #include <queue> #include <vector> #define P pair<int,int> using namespace std; int n, k, l, dir; int map[102][102]; int dx[] = { -1,0,1,0 }; int dy[] = { 0,1,0,-1 }; vector<P> snake; //0북 1동 2남 3서 void turn(int c) { if (c == 'L') { dir = (dir - 1 < 0) ? 3 : dir - 1; } else { dir = (dir + 1 > 3) ? 0 : dir + 1; } } //디버깅용 void printAll() { cout << endl; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cout << map[i][j] << " "; } cout << endl; } } int main() { cin >> n >> k; while (k--) { int r, c; cin >> r >> c; map[r][c] = 2; } cin >> l; queue<P> q; while (l--) { int d; char c; cin >> d >> c; q.push(P(d, c)); } map[1][1] = 1; snake.push_back(P(1, 1)); dir = 1; int time = 0; while (true) { //time확인하고 방향전환 if (!q.empty()) { if (q.front().first == time) { turn(q.front().second); q.pop(); } } //time 증가 time++; //다음지점 좌표 int ax = snake[snake.size() - 1].first + dx[dir]; int ay = snake[snake.size() - 1].second + dy[dir]; //벽에 부딪히거나 몸통에 부딪히면 종료 if (ax<1 || ay < 1 || ax>n || ay>n) break; if (map[ax][ay] == 1) break; //다음지점이 일반땅이면 if (map[ax][ay] != 2) { //map에서 꼬리부분 삭제 //벡터에서 꼬리부분 삭제 map[snake[0].first][snake[0].second] = 0; snake.erase(snake.begin()); } //벡터에 머리부분 추가 //맵에 머리부분 추가 snake.push_back(P(ax, ay)); map[ax][ay] = 1; } cout << time << endl; } | cs |