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
| #include <cstdio> #include <queue> using namespace std; int n, k, l; int board[101][101]; int dx[4] = { -1, 1, 0, 0 }; int dy[4] = { 0, 0, -1, 1 }; int d_left[4] = { 2, 3, 1, 0 }; int d_right[4] = { 3, 2, 0, 1 }; queue<pair<int, char> > direction; bool isWall(int x, int y) { if (x < 1 || y < 1 || x > n || y > n) return true; return false; } bool isBound(int x, int y) { if (x > 0 && y > 0 && x <= n && y <= n) return true; return false; } int game() { int x = 1; int y = 1; int dir = 3; int len = 1; int time = 0; board[x][y] = 1; while (true) { int convert = 0; if (!direction.empty()) { convert = direction.front().first; } time++; int d_x = x + dx[dir]; int d_y = y + dy[dir]; if (isWall(d_x, d_y) || board[d_x][d_y] > 0) return time; if (time == convert) { if (direction.front().second == 'D') { dir = d_right[dir]; } else { dir = d_left[dir]; } direction.pop(); } if (board[d_x][d_y] == -1) { board[d_x][d_y] = ++len; x = d_x; y = d_y; continue; } int tmp_x = x, tmp_y = y; for (int i = 1; i < len; ++i) { for (int j = 0; j < 4; ++j) { int d_tmp_x = tmp_x + dx[j]; int d_tmp_y = tmp_y + dy[j]; if (isBound(d_tmp_x, d_tmp_y)) { if (board[d_tmp_x][d_tmp_y] == board[tmp_x][tmp_y] - 1) { board[tmp_x][tmp_y] = board[d_tmp_x][d_tmp_y]; tmp_x = d_tmp_x; tmp_y = d_tmp_y; break; } } } } board[d_x][d_y] = len; board[tmp_x][tmp_y] = 0; x = d_x; y = d_y; } } int main() { scanf("%d %d", &n, &k); for (int i = 0; i < k; ++i) { int r, c; scanf("%d %d", &r, &c); board[r][c] = -1; } scanf("%d", &l); for (int i = 0; i < l; ++i) { int x; char dir; scanf("%d %c", &x, &dir); direction.push({ x, dir }); } printf("%d\n", game()); return 0; }
|