Source code for submission s658

grasshop.cpp

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <queue>
  4. #include <set>
  5.  
  6. #define getc() getc(stdin)
  7. typedef unsigned int uint;
  8. using namespace std;
  9.  
  10. struct pos {
  11. int r;
  12. int c;
  13. int jumps;
  14. };
  15.  
  16. int main()
  17. {
  18. int rMod[8] = {2,2,1,-1,-2,-2,-1,1};
  19. int cMod[8] = {-1,1,2,2,1,-1,-2,-2};
  20.  
  21. int R = 0, C = 0, GR = 0, GC = 0, LR = 0, LC = 0;
  22. while (scanf("%d%d%d%d%d%d", &R, &C, &GR, &GC, &LR, &LC) == 6) {
  23. queue<pos> q;
  24. pos start;
  25. set<pair<int, int> > positions;
  26. start.c = GC;
  27. start.r = GR;
  28. start.jumps = 0;
  29. q.push(start);
  30. positions.insert(make_pair(GC, GR));
  31.  
  32. while (!q.empty()) {
  33.  
  34. pos oldPos = q.front();
  35. q.pop();
  36.  
  37. if (oldPos.c == LC && oldPos.r == LR) {
  38. printf("%d\n", oldPos.jumps);
  39. break;
  40. }
  41.  
  42. oldPos.jumps++;
  43. for (int i = 0; i < 8; i++) {
  44. if (oldPos.r + rMod[i] <= R && oldPos.r + rMod[i] >= 1 &&
  45. oldPos.c + cMod[i] <= C && oldPos.c + cMod[i] >= 1) {
  46. pos newPos;
  47. newPos.jumps = oldPos.jumps;
  48. newPos.r = oldPos.r + rMod[i];
  49. newPos.c = oldPos.c + cMod[i];
  50. if (positions.insert(make_pair(newPos.r, newPos.c)).second)
  51. {
  52. q.push(newPos);
  53. }
  54. }
  55. }
  56. }
  57.  
  58. if (q.empty()) {
  59. printf("impossible\n");
  60. }
  61. }
  62. // cout << "Hello World!" << endl;
  63. return 0;
  64. }
  65.  
  66.