Source code for submission s780

grasshop.cpp

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<queue>
  4.  
  5. struct Pad {
  6. bool visited;
  7. int steps;
  8. };
  9.  
  10. struct Pos {
  11. int x, y, steps;
  12. Pos(){};
  13. Pos(int xp, int yp, int stepsp) {
  14. x = xp; y = yp; steps = stepsp;
  15. }
  16. };
  17.  
  18. class GrassHop {
  19. Pad grid[104][104];
  20. int destx, desty;
  21. int gridx, gridy;
  22. int gregx, gregy;
  23. std::queue<Pos> myq;
  24. public:
  25. GrassHop();
  26. bool Load();
  27. //void Resetgrid(int x, int y);
  28. void Solve();
  29. };
  30.  
  31. GrassHop::GrassHop() {
  32. for(int i = 0; i < 104; i++){
  33. grid[i][0].visited = true;
  34. grid[i][1].visited = true;
  35. grid[0][i].visited = true;
  36. grid[1][i].visited = true;
  37. grid[i][103].visited = true;
  38. grid[i][102].visited = true;
  39. grid[103][i].visited = true;
  40. grid[102][i].visited = true;
  41. }
  42.  
  43. }
  44.  
  45. bool GrassHop::Load() {
  46. int i, j;
  47. if(scanf("%d%d%d%d%d%d ", &gridx, &gridy, &gregx, &gregy, &destx, &desty) != 6) return false;
  48. /* init cycles */
  49. for(j=2; j < gridy+2; j++) {
  50. for(i = 2; i < gridx+2; i++) {
  51. grid[i][j].visited = false;
  52. }
  53. for(int k = 0; k < 2; k++, i++) {
  54. grid[i][j].visited = true;
  55. }
  56. }
  57. for(i=2; i< gridx+4; i++)
  58. for(j=gridy+2; j<gridy+4; j++)
  59. grid[i][j].visited=true;
  60.  
  61.  
  62. gregx += 1;
  63. gregy += 1;
  64. destx += 1;
  65. desty += 1;
  66. /*
  67. for(i = 0; i < 20; i++) {
  68. for(j = 0; j< 20; j++) {
  69. printf("%c", grid[i][j].visited ? '1' : '0');
  70. }
  71. printf("\n");
  72. }*/
  73.  
  74. while(!myq.empty()) myq.pop();
  75. myq.push(Pos(gregx,gregy,0));
  76. return true;
  77. }
  78.  
  79. void GrassHop::Solve() {
  80. Pos p;
  81. while(!myq.empty()) {
  82. p = myq.front();
  83. myq.pop();
  84. //printf("%d %d %c\n", p.x, p.y, grid[p.x][p.y].visited ? '1' : '0');
  85. if(grid[p.x][p.y].visited) continue;
  86. grid[p.x][p.y].visited = true;
  87. grid[p.x][p.y].steps = p.steps;
  88. if(p.x == destx && p.y == desty) break;
  89. p.steps++;
  90. myq.push(Pos(p.x+2,p.y+1,p.steps));
  91. myq.push(Pos(p.x+2,p.y-1,p.steps));
  92. myq.push(Pos(p.x-2,p.y+1,p.steps));
  93. myq.push(Pos(p.x-2,p.y-1,p.steps));
  94. myq.push(Pos(p.x+1,p.y+2,p.steps));
  95. myq.push(Pos(p.x+1,p.y-2,p.steps));
  96. myq.push(Pos(p.x-1,p.y+2,p.steps));
  97. myq.push(Pos(p.x-1,p.y-2,p.steps));
  98. }
  99.  
  100. if(grid[destx][desty].visited){
  101. printf("%d\n",grid[destx][desty].steps);
  102. } else {
  103. printf("impossible\n");
  104. }
  105. }
  106. int main(int argc, char * argv[]) {
  107. GrassHop g;
  108. while(g.Load()) g.Solve();
  109. return 0;
  110. }
  111.