fork download
  1. #include <iostream>
  2. #include <queue>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. ios_base::sync_with_stdio(0);
  9. int il,kolumny,wiersze,xbohatera,ybohatera,aktx,akty,popx,popy;
  10. cin>>il;
  11. for(int i = 0; i < il; i++)
  12. {
  13. cin>>wiersze>>kolumny;
  14. char **tab;
  15. tab = new char*[wiersze];
  16. int **odl;
  17. odl = new int*[wiersze];
  18. for(int j = 0; j < wiersze; j++)
  19. {
  20. tab[j]=new char[kolumny];
  21. odl[j]=new int[kolumny];
  22. for(int k = 0; k < kolumny; k++)
  23. {
  24. cin>>tab[j][k];
  25. if(tab[j][k]=='@')
  26. {
  27. xbohatera=k;
  28. ybohatera=j;
  29. }
  30. odl[j][k]=-1;
  31. }
  32. }
  33. cout<<tab[0][0];
  34. //tu nalezy przygotowac i rozpoczac przeszukiwanie
  35. queue <int> wspx;
  36. queue <int> wspy;
  37. wspx.push(xbohatera);
  38. wspy.push(ybohatera);
  39. popx=xbohatera;
  40. popy=ybohatera;
  41. odl[ybohatera][xbohatera]=0;
  42. cout<<odl[ybohatera][xbohatera];
  43. while(wspx.empty()!=true)
  44. {
  45. cout<<'x';
  46. aktx=wspx.front();
  47. wspx.pop();
  48. akty=wspy.front();
  49. wspy.pop();
  50. //oznaczenie sasiadujacych kropek i plusow odlegloscia i dodanie ich wspolrzednych do kolejki
  51. if(aktx-1>-1)
  52. {
  53. if(tab[akty][aktx-1]=='.'||tab[akty][aktx-1]=='+') //odwiedzic tylko, jezeli odwiedzenie mozliwe
  54. {
  55. if(odl[akty][aktx-1]==-1) //odwiedzic tylko, jezeli nieodwiedzone
  56. {
  57. odl[akty][aktx-1]=odl[popy][popx]+1;
  58. wspx.push(aktx-1);
  59. wspy.push(akty);
  60. if(tab[akty][aktx-1]=='>') //jezeli koniec
  61. {
  62. cout<<odl[popy][popx]+1<<endl;
  63. break;
  64. }
  65. }
  66. }
  67. }
  68. if(aktx+1<wiersze)
  69. {
  70. if(tab[akty][aktx+1]=='.'||tab[akty][aktx+1]=='+') //odwiedzic tylko, jezeli odwiedzenie mozliwe
  71. {
  72. if(odl[akty][aktx+1]==-1) //odwiedzic tylko, jezeli nieodwiedzone
  73. {
  74. odl[akty][aktx+1]=odl[popy][popx]+1;
  75. wspx.push(aktx+1);
  76. wspy.push(akty);
  77. if(tab[akty][aktx+1]=='>') //jezeli koniec
  78. {
  79. cout<<odl[popy][popx]+1<<endl;
  80. break;
  81. }
  82. }
  83. }
  84. }
  85. if(akty-1>-1)
  86. {
  87. if(tab[akty-1][aktx]=='.'||tab[akty-1][aktx]=='+') //odwiedzic tylko, jezeli odwiedzenie mozliwe
  88. {
  89. if(odl[akty-1][aktx]==-1) //odwiedzic tylko, jezeli nieodwiedzone
  90. {
  91. odl[akty-1][aktx]=odl[popy][popx]+1;
  92. wspx.push(aktx);
  93. wspy.push(akty-1);
  94. if(tab[akty-1][aktx]=='>') //jezeli koniec
  95. {
  96. cout<<odl[popy][popx]+1<<endl;
  97. break;
  98. }
  99. }
  100. }
  101. }
  102. if(akty+1<kolumny)
  103. {
  104. if(tab[akty+1][aktx]=='.'||tab[akty+1][aktx]=='+') //odwiedzic tylko, jezeli odwiedzenie mozliwe
  105. {
  106. if(odl[akty+1][aktx]==-1) //odwiedzic tylko, jezeli nieodwiedzone
  107. {
  108. odl[akty+1][aktx]=odl[popy][popx]+1;
  109. wspx.push(aktx);
  110. wspy.push(akty+1);
  111. if(tab[akty+1][aktx]=='>') //jezeli koniec
  112. {
  113. cout<<odl[popy][popx]+1<<endl;
  114. break;
  115. }
  116. }
  117. }
  118. }
  119. popx=aktx;
  120. popy=akty;
  121. if(wspx.empty()==true)
  122. {
  123. cout<<"NIE"<<endl;
  124. break;
  125. }
  126. } //nawias petli while
  127.  
  128. for(int j = 0; j < wiersze; j++)
  129. {
  130. delete [] tab[j];
  131. delete [] odl[j];
  132. }
  133. delete [] tab;
  134. delete [] odl;
  135.  
  136. }
  137. return 0;
  138. }
  139.  
Runtime error #stdin #stdout 0s 4572KB
stdin
1
4 8
....#...
.##.#.#.
.##.#.#.
.@#...#>
stdout
Standard output is empty