Source code for submission s611

grasshop.cpp

  1. #include <cstdio>
  2. #include <queue>
  3. #include <cstring>
  4. #include <string>
  5.  
  6. using namespace std;
  7.  
  8. struct Point {
  9. int a;
  10. int b;
  11. };
  12.  
  13. queue <Point> trace;
  14. int grid[200][200];
  15. int a, b, a1, b1, a2, b2;
  16.  
  17. bool push (Point next) {
  18. Point cur = trace.front();
  19. if (next.a >= 0 && next.a < a && next.b >= 0 && next.b < b) {
  20. if (grid[cur.a][cur.b] + 1 < grid[next.a][next.b]) {
  21. trace.push (next);
  22. grid[next.a][next.b] = grid[cur.a][cur.b] + 1;
  23. if (next.a == a2 && next.b == b2)
  24. return true;
  25. }
  26. }
  27. return false;
  28. }
  29.  
  30. int main() {
  31. while (scanf ("%d%d%d%d%d%d", &a, &b, &a1, &b1, &a2, &b2) == 6) {
  32. for (int i = 0; i < 200; i++)
  33. for (int j = 0; j < 200; j++)
  34. grid[i][j] = 1000000000;
  35.  
  36. Point start;
  37. start.a = a1;
  38. start.b = b1;
  39. grid[a1][b1] = 0;
  40. trace.push (start);
  41. while (!trace.empty()) {
  42. Point cur = trace.front();
  43. Point next;
  44. next.a = cur.a - 2;
  45. next.b = cur.b - 1;
  46. if (push (next)) { printf ("%d\n", grid[next.a][next.b]); goto next; }
  47. next.a = cur.a - 2;
  48. next.b = cur.b + 1;
  49. if (push (next)) { printf ("%d\n", grid[next.a][next.b]); goto next; }
  50. next.a = cur.a + 2;
  51. next.b = cur.b - 1;
  52. if (push (next)) { printf ("%d\n", grid[next.a][next.b]); goto next; }
  53. next.a = cur.a + 2;
  54. next.b = cur.b + 1;
  55. if (push (next)) { printf ("%d\n", grid[next.a][next.b]); goto next; }
  56. next.a = cur.a - 1;
  57. next.b = cur.b - 2;
  58. if (push (next)) { printf ("%d\n", grid[next.a][next.b]); goto next; }
  59. next.a = cur.a - 1;
  60. next.b = cur.b + 2;
  61. if (push (next)) { printf ("%d\n", grid[next.a][next.b]); goto next; }
  62. next.a = cur.a + 1;
  63. next.b = cur.b - 2;
  64. if (push (next)) { printf ("%d\n", grid[next.a][next.b]); goto next; }
  65. next.a = cur.a + 1;
  66. next.b = cur.b + 2;
  67. if (push (next)) { printf ("%d\n", grid[next.a][next.b]); goto next; }
  68. trace.pop();
  69. }
  70. printf ("impossible\n");
  71. next:;
  72. while (!trace.empty()) trace.pop();
  73. }
  74. return 0;
  75. }