Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.81 KB | None | 0 0
  1. //Eternal Truths - UVA - 928
  2. //BFS
  3. #include<iostream>
  4. #include<fstream>
  5. #include<climits>
  6. #include<cstring>
  7. #include<queue>
  8. using namespace std;
  9.  
  10. char graph[301][301];
  11. int visited[301][301][3];
  12.  
  13. int xmov[4] = { -1,0,0,1 };
  14. int ymov[4] = { 0,-1,1,0 };
  15.  
  16. bool issafe(char graph[301][301], int r, int c, int x, int y) {
  17. if (x >= 1 && x <= r && y >= 1 && y <= c && graph[x][y] != '#') return true;
  18. return false;
  19. }
  20.  
  21. void initialize(int arr[301][301][3]) {
  22. for (int i = 0; i < 301; i++)
  23. for (int j = 0; j < 301; j++)
  24. for (int k = 0; k < 3; k++)
  25. arr[i][j][k] = 0;
  26. }
  27.  
  28. int main() {
  29. ifstream in;
  30. ofstream out;
  31. in.open("file.txt");
  32. out.open("output.txt");
  33. int t,r,c,xst,yst,xend,yend;
  34. in >> t;
  35. while (t--) {
  36. initialize(visited);
  37. in >> r >> c;
  38. for (int i = 1; i <= r; i++)
  39. for (int j = 1; j <= c; j++){
  40. in >> graph[i][j];
  41. if (graph[i][j] == 'S') xst = i, yst = j;
  42. if (graph[i][j] == 'E') xend = i, yend = j;
  43. }
  44. queue<int> q;
  45. q.push(xst);
  46. q.push(yst);
  47. q.push(1);
  48. visited[xst][yst][0] = 1;
  49. int xtemp, ytemp,ltemp ;
  50. bool flagg = false;
  51. while (!q.empty()) {
  52. xtemp = q.front();
  53. q.pop();
  54. ytemp = q.front();
  55. q.pop();
  56. ltemp = q.front();
  57. q.pop();
  58. if (xtemp == xend && ytemp == yend) {
  59. out << ltemp -1 <<endl;
  60. flagg = true;
  61. break;
  62. }
  63. for (int i = 0; i < 4; i++) {
  64. int xnext = xtemp, ynext = ytemp;
  65. bool flag = true;
  66. for (int j = 0; j <= (ltemp-1) % 3; j++) {
  67. xnext = xnext + xmov[i], ynext = ynext + ymov[i];
  68. if (issafe(graph, r, c, xnext, ynext)) continue;
  69. else {
  70. flag = false;
  71. break;
  72. }
  73. }
  74. if (flag == false) continue;
  75. if (!visited[xnext][ynext][(ltemp-1) % 3]) {
  76. visited[xnext][ynext][(ltemp-1) % 3] = 1;
  77. q.push(xnext);
  78. q.push(ynext);
  79. q.push(ltemp + 1);
  80. }
  81. }
  82. }
  83. if (!flagg) out << "NO" <<endl;
  84. }
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement