YauhenMardan

Untitled

Mar 26th, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.47 KB | None | 0 0
  1. #include <fstream>
  2. #include <stack>
  3.  
  4. class Maze{
  5. private:
  6. enum direction {LEFT,DOWN,RIGHT,UP};
  7.  
  8.  
  9. int* fromUp=new int[3]{LEFT, RIGHT, UP};
  10. int* fromDown=new int[3]{LEFT, DOWN, RIGHT};
  11. int* fromLeft=new int[3]{LEFT, DOWN, UP};
  12. int* fromRight=new int[3]{DOWN, RIGHT, UP};
  13.  
  14. int n;
  15. int m;
  16. int **maze;
  17.  
  18. int* availDir;
  19.  
  20. int routMarker;
  21.  
  22. public:
  23. Maze(){
  24. }
  25. void readMaze(std::ifstream& fin){
  26. fin>>n;
  27. fin>>m;
  28. //init maze
  29. maze=new int*[n];
  30. for(int i=0;i<n;i++){
  31. maze[i]=new int[m];
  32. }
  33. //fill default maze
  34. char t;
  35. for(int i=0;i<n;i++){
  36. for(int j=0;j<m;j++){
  37. fin>>t;
  38. maze[i][j]=t-'0';
  39. }
  40. }
  41. }
  42.  
  43. bool step(std::stack<std::pair<int, int>>& route_stack,int direction){
  44. int dx,dy;
  45. switch (direction) {
  46. case UP:
  47. dx=-1;
  48. dy=0;
  49. break;
  50. case DOWN:
  51. dx=1;
  52. dy=0;
  53. break;
  54. case LEFT:
  55. dx=0;
  56. dy=-1;
  57. break;
  58. case RIGHT:
  59. dx=0;
  60. dy=1;
  61. break;
  62. default:
  63. dx=n;
  64. dy=m;
  65. break;
  66. }
  67. std::pair<int, int> next=std::make_pair(route_stack.top().first+dx, route_stack.top().second+dy);
  68. if(isOut(next)){
  69. return false;
  70. }
  71. route_stack.push(next);
  72. maze[route_stack.top().first][route_stack.top().second]=2;
  73. if(route_stack.top().first==n-1){
  74. return true;
  75. }
  76. switch (direction) {
  77. case UP:
  78. availDir=fromUp;
  79. break;
  80. case DOWN:
  81. availDir=fromDown;
  82. break;
  83. case LEFT:
  84. availDir=fromLeft;
  85. break;
  86. case RIGHT:
  87. availDir=fromRight;
  88. break;
  89. default:
  90. availDir=NULL;
  91. break;
  92. }
  93. for(int i=0;i<3;i++){
  94. if (step(route_stack, availDir[i]))
  95. return true;
  96. }
  97. maze[route_stack.top().first][route_stack.top().second] = 0;
  98. route_stack.pop();
  99. return false;
  100. }
  101. bool isOut(const std::pair<int, int>& point){
  102. return (point.first<0 || point.second<0 || point.first>=n || point.second>=m || maze[point.first][point.second]!=0);
  103. }
  104. bool getAnswer(){
  105. //algorithm
  106.  
  107. for(int i=0;i<m;i++){
  108. if(maze[0][i]==0){
  109. if(n==1){
  110. return true;
  111. }
  112. std::stack<std::pair<int, int>> route_stack;
  113. route_stack.push(std::make_pair(0, i));
  114. if(!step(route_stack, DOWN)){
  115. return false;
  116. }
  117. }
  118. }
  119. return true;
  120. }
  121. void printAnswer(std::ofstream& fout){
  122. if(getAnswer()==false){
  123. fout<<"Impossible\n";
  124. } else{
  125. fout<<"Possible\n";
  126. }
  127. }
  128. };
  129.  
  130. int main(int argc, const char * argv[]) {
  131. std::ifstream fin("in.txt");
  132. std::ofstream fout("out.txt");
  133. Maze mz;
  134. mz.readMaze(fin);
  135. mz.printAnswer(fout);
  136. return 0;
  137. }
Advertisement
Add Comment
Please, Sign In to add comment