Source code for submission s1107

grasshop.cpp

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <queue>
  4. using namespace std;
  5.  
  6. struct Pos
  7. {
  8. int x;
  9. int y;
  10. };
  11.  
  12. static const int MAX = 105;
  13. int pole[MAX][MAX];
  14.  
  15. queue<Pos> fronta;
  16.  
  17.  
  18.  
  19. void pridej ( const Pos & tmp){
  20. Pos nov;
  21. nov.x = tmp.x-1;
  22. nov.y = tmp.y+2;
  23. if (pole[nov.x+1][nov.y+1])
  24. {
  25. if ( pole[nov.x+1][nov.y+1] == -1 || pole[nov.x+1][nov.y+1] > (pole[tmp.x+1][tmp.y+1] +1) ) {
  26. //printf("%d %d\n", nov.x, nov.y);
  27. fronta.push(nov);
  28. pole[nov.x+1][nov.y+1] = pole[tmp.x+1][tmp.y+1] +1;
  29. }
  30. }
  31. nov.x -= 1;
  32. nov.y -= 1;
  33. if (pole[nov.x+1][nov.y+1])
  34. {
  35. if ( pole[nov.x+1][nov.y+1] == -1 || pole[nov.x+1][nov.y+1] > (pole[tmp.x+1][tmp.y+1] +1) ) {
  36.  
  37. //printf("%d %d\n", nov.x, nov.y);
  38. fronta.push(nov);
  39. pole[nov.x+1][nov.y+1] = pole[tmp.x+1][tmp.y+1] +1;
  40. }
  41. }
  42.  
  43. nov.y -= 2;
  44. if (pole[nov.x+1][nov.y+1])
  45. {
  46. if ( pole[nov.x+1][nov.y+1] == -1 || pole[nov.x+1][nov.y+1] > (pole[tmp.x+1][tmp.y+1] +1) ) {
  47.  
  48. //printf("%d %d\n", nov.x, nov.y);
  49. fronta.push(nov);
  50. pole[nov.x+1][nov.y+1] = pole[tmp.x+1][tmp.y+1] +1;
  51. }
  52. }
  53. nov.x +=1;
  54. nov.y -=1;
  55. if (pole[nov.x+1][nov.y+1])
  56. {
  57. if ( pole[nov.x+1][nov.y+1] == -1 || pole[nov.x+1][nov.y+1] > (pole[tmp.x+1][tmp.y+1] +1) ) {
  58.  
  59. //printf("%d %d\n", nov.x, nov.y);
  60. fronta.push(nov);
  61. pole[nov.x+1][nov.y+1] = pole[tmp.x+1][tmp.y+1] +1;
  62. }
  63. }
  64. nov.x +=2;
  65. if (pole[nov.x+1][nov.y+1])
  66. {
  67. if ( pole[nov.x+1][nov.y+1] == -1 || pole[nov.x+1][nov.y+1] > (pole[tmp.x+1][tmp.y+1] +1) ) {
  68.  
  69. //printf("%d %d\n", nov.x, nov.y);
  70. fronta.push(nov);
  71. pole[nov.x+1][nov.y+1] = pole[tmp.x+1][tmp.y+1] +1;
  72. }
  73. }
  74. nov.x +=1;
  75. nov.y +=1;
  76. if (pole[nov.x+1][nov.y+1])
  77. {
  78. if ( pole[nov.x+1][nov.y+1] == -1 || pole[nov.x+1][nov.y+1] > (pole[tmp.x+1][tmp.y+1] +1) ) {
  79.  
  80. //printf("%d %d\n", nov.x, nov.y);
  81. fronta.push(nov);
  82. pole[nov.x+1][nov.y+1] = pole[tmp.x+1][tmp.y+1] +1;
  83. }
  84. }
  85. nov.y +=2;
  86. if (pole[nov.x+1][nov.y+1])
  87. {
  88. if ( pole[nov.x+1][nov.y+1] == -1 || pole[nov.x+1][nov.y+1] > (pole[tmp.x+1][tmp.y+1] +1) ) {
  89.  
  90. //printf("%d %d\n", nov.x, nov.y);
  91. fronta.push(nov);
  92. pole[nov.x+1][nov.y+1] = pole[tmp.x+1][tmp.y+1] +1;
  93. }
  94. }
  95. nov.x -=1;
  96. nov.y +=1;
  97. if (pole[nov.x+1][nov.y+1])
  98. {
  99. if ( pole[nov.x+1][nov.y+1] == -1 || pole[nov.x+1][nov.y+1] > (pole[tmp.x+1][tmp.y+1] +1) ) {
  100.  
  101. //printf("%d %d\n", nov.x, nov.y);
  102. fronta.push(nov);
  103. pole[nov.x+1][nov.y+1] = pole[tmp.x+1][tmp.y+1] +1;
  104. }
  105. }
  106.  
  107. }
  108. void print(int x, int y);
  109. void nuluj(int x, int y){
  110.  
  111. for (int i = 2; i <= x+1; i++)
  112. for ( int j=2; j <= y+1; j++)
  113. pole[i][j]=-1;
  114.  
  115.  
  116. for ( int j=0; j <= y+3; j++)
  117. pole[x+2][j]=pole[x+3][j]=0;
  118.  
  119. for ( int j=0; j <= x+3; j++)
  120. pole[j][y+2]=pole[j][y+3]=0;
  121.  
  122. //print(x,y);
  123.  
  124. }
  125. void print(int x, int y) {
  126.  
  127. for (int i = 0; i <= x+3; i++){
  128. for ( int j=0; j <= y+3; j++)
  129. printf("%d ",pole[i][j]);
  130.  
  131. printf("\n");
  132. }
  133.  
  134. }
  135.  
  136. int main(){
  137. int r,s,gr,gs,ls,lr;
  138. Pos tmp;
  139.  
  140. while (scanf("%d %d %d %d %d %d", &r, &s, &gr, &gs, &lr, &ls) == 6)
  141. {
  142. nuluj(s,r);
  143. tmp.y = gr;
  144. tmp.x = gs;
  145. pole[tmp.x+1][tmp.y+1]=0;
  146. fronta.push(tmp);
  147.  
  148. while (!fronta.empty())
  149. {
  150. ////printf("[%d,%d]%d\n", tmp.x, tmp.y, pole[tmp.x+1][tmp.y+1]);
  151. tmp = fronta.front();
  152. fronta.pop();
  153. if ( tmp.y == lr && tmp.x == ls ) {
  154.  
  155. break;
  156. }
  157. pridej(tmp);
  158. }
  159. //printf("------\n");
  160. //print(s,r);
  161. if ( tmp.x == ls && tmp.y == lr ){
  162.  
  163. printf("%d\n", pole[tmp.x+1][tmp.y+1]);
  164. }
  165. else
  166. printf("impossible\n");
  167.  
  168. while (!fronta.empty()) fronta.pop();
  169. }
  170. return 0;
  171. }
  172.  
  173.