fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4.  
  5. using namespace std;
  6.  
  7. // Offset để dịch tọa độ từ [-1000, 1000] sang [0, 2000]
  8. const int OFFSET = 1000;
  9. const int GRID_SIZE = 2005;
  10.  
  11. // Mảng đánh dấu vật cản và khoảng cách
  12. int dist[GRID_SIZE][GRID_SIZE];
  13. bool is_blocked[GRID_SIZE][GRID_SIZE];
  14.  
  15. struct Point {
  16. int x, y;
  17. };
  18.  
  19. int main() {
  20. ios_base::sync_with_stdio(false);
  21. cin.tie(NULL);
  22.  
  23. int n;
  24. long long D;
  25. cin >> n >> D; // n <= 10^4, D <= 10^7
  26.  
  27. // Khởi tạo trạng thái ban đầu
  28. for (int i = 0; i < GRID_SIZE; i++) {
  29. for (int j = 0; j < GRID_SIZE; j++) {
  30. dist[i][j] = -1;
  31. is_blocked[i][j] = false;
  32. }
  33. }
  34.  
  35. // Đọc các ô bị chặn và đánh dấu
  36. for (int i = 0; i < n; i++) {
  37. int x, y;
  38. cin >> x >> y; // Giá trị tuyệt đối của x và y nhỏ hơn 10^3
  39. is_blocked[x + OFFSET][y + OFFSET] = true;
  40. }
  41.  
  42. // BFS
  43. queue<Point> q;
  44. q.push({0 + OFFSET, 0 + OFFSET});
  45. dist[0 + OFFSET][0 + OFFSET] = 0;
  46.  
  47. long long count = 0;
  48. int dx[] = {-1, 1, 0, 0};
  49. int dy[] = {0, 0, -1, 1};
  50.  
  51. while (!q.empty()) {
  52. Point curr = q.front();
  53. q.pop();
  54.  
  55. // Nếu khoảng cách đã đạt tới D thì không cần mở rộng thêm
  56. if (dist[curr.x][curr.y] >= D) continue;
  57.  
  58. for (int i = 0; i < 4; i++) {
  59. int nx = curr.x + dx[i];
  60. int ny = curr.y + dy[i];
  61.  
  62. // Kiểm tra biên mảng và vật cản
  63. if (nx >= 0 && nx < GRID_SIZE && ny >= 0 && ny < GRID_SIZE
  64. && !is_blocked[nx][ny] && dist[nx][ny] == -1) {
  65.  
  66. dist[nx][ny] = dist[curr.x][curr.y] + 1;
  67. q.push({nx, ny});
  68. }
  69. }
  70. }
  71.  
  72. // Đếm số tọa độ đã đi được
  73. for (int i = 0; i < GRID_SIZE; i++) {
  74. for (int j = 0; j < GRID_SIZE; j++) {
  75. if (dist[i][j] != -1 && dist[i][j] <= D) {
  76. count++;
  77. }
  78. }
  79. }
  80.  
  81. cout << count << endl;
  82.  
  83. return 0;
  84. }
Success #stdin #stdout 0.01s 23224KB
stdin
4 5
-1 1
0 -1
0 1
1 0
stdout
26