Source code for submission s805

grasshop.cpp

  1. #include <cstdio>
  2. #include <vector>
  3. #include <queue>
  4.  
  5. using namespace std;
  6.  
  7. int R, C;
  8.  
  9. typedef struct {
  10. int x, y;
  11. } coord;
  12.  
  13. // We could not remember struct constructor syntax... :-/
  14. coord makecoord(int x, int y) {
  15. coord temp;
  16. temp.x = x;
  17. temp.y = y;
  18. return temp;
  19. }
  20.  
  21. inline bool is_inside(int x, int y) {
  22. return (x >= 0 && y >= 0 && x < R && y < C);
  23. }
  24.  
  25. inline bool is_inside(coord c) {
  26. return is_inside(c.x, c.y);
  27. }
  28.  
  29. vector<coord> get_neighbours(coord c) {
  30. vector<coord> temp;
  31. int x = c.x;
  32. int y = c.y;
  33. if (is_inside(x+2,y-1)) { temp.push_back(makecoord(x+2, y-1)); }
  34. if (is_inside(x+2,y+1)) { temp.push_back(makecoord(x+2, y+1)); }
  35. if (is_inside(x-2,y-1)) { temp.push_back(makecoord(x-2, y-1)); }
  36. if (is_inside(x-2,y+1)) { temp.push_back(makecoord(x-2, y+1)); }
  37. if (is_inside(x-1,y+2)) { temp.push_back(makecoord(x-1, y+2)); }
  38. if (is_inside(x+1,y+2)) { temp.push_back(makecoord(x+1, y+2)); }
  39. if (is_inside(x-1,y-2)) { temp.push_back(makecoord(x-1, y-2)); }
  40. if (is_inside(x+1,y-2)) { temp.push_back(makecoord(x+1, y-2)); }
  41. return temp;
  42. }
  43.  
  44. inline bool is_unvisited(coord c, const vector<vector<int> > &map) {
  45. return map[c.x][c.y] == 0;
  46. }
  47.  
  48. int main() {
  49. int Gr, Gc, Lr, Lc;
  50. while (scanf("%d %d %d %d %d %d", &R, &C, &Gr, &Gc, &Lr, &Lc) == 6) {
  51. if (Gr == Lr && Gc == Lc) { printf("0\n"); continue; }
  52. vector<vector<int> > field(R);
  53. for (int i = 0; i < R; i++) {
  54. field[i].resize(C);
  55. }
  56. queue<coord> q;
  57. coord current;
  58. q.push(makecoord(Gr-1, Gc-1));
  59. int level = 1;
  60. size_t remaining = 1;
  61. while(!q.empty()) {
  62. remaining--;
  63. if (remaining == 0) { level++; remaining = q.size(); }
  64. current = q.front();
  65. q.pop();
  66. if (current.x == Lr-1 && current.y == Lc-1) {
  67. break;
  68. }
  69. vector<coord> neig = get_neighbours(current);
  70. for (size_t i = 0; i < neig.size(); i++) {
  71. if (is_unvisited(neig[i], field)) {
  72. field[neig[i].x][neig[i].y] = level;
  73. q.push(neig[i]);
  74. }
  75. }
  76. }
  77. if (field[Lr-1][Lc-1] != 0) {
  78. printf("%d\n", field[Lr-1][Lc-1]-1);
  79. } else {
  80. printf("impossible\n");
  81. }
  82. }
  83. return 0;
  84. }
  85.