Source code for submission s961

grasshop.cpp

  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4. using namespace std;
  5.  
  6. bool isInArea(int posX, int posY, int destX, int destY)
  7. {
  8. return ((abs(posX - destX) <= 2) &&
  9. (abs(posY - destY) <= 2) );
  10. }
  11.  
  12. bool size3443(int sizeX, int sizeY)
  13. {
  14. return ( ( sizeX >= 3 && sizeY>=4 ) ||
  15. ( sizeX >= 4 && sizeY>=3 ) );
  16. }
  17.  
  18. bool size3223(int sizeX, int sizeY)
  19. {
  20. return ( ( sizeX >= 2 && sizeY>=3 ) ||
  21. ( sizeX >= 3 && sizeY>=2 ) );
  22. }
  23. int getStepsInArea(int posX, int posY, int destX, int destY, int sizeX, int sizeY)
  24. {
  25. int diffX = abs (destX - posX);
  26. int diffY = abs (destY - posY);
  27. if (size3443(sizeX, sizeY))
  28. {
  29. if ((diffX == 1 && diffY == 0) ||
  30. (diffX == 0 && diffY == 1) ) return 3;
  31.  
  32. if ((diffX == 2 && diffY == 0) ||
  33. (diffX == 0 && diffY == 2) ||
  34. (diffX == 1 && diffY == 1) ) return 2;
  35. if (diffX == 2 && diffY == 2) return 4;
  36. }
  37.  
  38. if (size3223(sizeX, sizeY))
  39. {
  40. if ((diffX == 1 && diffY == 2) ||
  41. (diffX == 2 && diffY == 1) ) return 1;
  42. }
  43. return -1111;
  44. }
  45.  
  46.  
  47.  
  48. int main()
  49. {
  50. int sizeX, sizeY, destX, destY, posX, posY, diffX, diffY;
  51. while ( scanf("%d%d%d%d%d%d", &sizeX, &sizeY, &posX, &posY
  52. , &destX, &destY ) == 6 )
  53. {
  54. int stepCount = 0;
  55. while (!isInArea(posX, posY, destX, destY))
  56. {
  57. int goX;
  58. int goY;
  59. diffX = destX - posX;
  60. diffY = destY - posY;
  61. if (abs(diffX) > abs(diffY))
  62. {
  63.  
  64. if (diffX > 0) goX = 2;
  65. else goX = -2;
  66. if (diffY > 0) goY = 1;
  67. else goY = -1;
  68. }
  69. else
  70. {
  71. if (diffY > 0) goY = 2;
  72. else goY = -2;
  73. if (diffX > 0) goX = 1;
  74. else goX = -1;
  75. }
  76. posX+=goX;
  77. posY+=goY;
  78. stepCount++;
  79. }
  80. int stepsInArea = getStepsInArea(posX, posY, destX, destY, sizeX, sizeY);
  81. if (stepsInArea<0) printf ("impossible\n");
  82. else
  83. {
  84. stepCount += stepsInArea;
  85. printf ("%d\n", stepCount);
  86. }
  87. }
  88. return 0;
  89. }
  90.