YauhenMardan

Untitled

Mar 27th, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.96 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. public:
  21. Maze(){
  22. }
  23. void readMaze(std::ifstream& fin){
  24. fin>>n;
  25. fin>>m;
  26. //init maze
  27. maze=new int*[n];
  28. for(int i=0;i<n;i++){
  29. maze[i]=new int[m];
  30. }
  31. //fill default maze
  32. char t;
  33. for(int i=0;i<n;i++){
  34. for(int j=0;j<m;j++){
  35. fin>>t;
  36. maze[i][j]=t-'0';
  37. }
  38. }
  39. }
  40.  
  41. bool step(std::stack<std::pair<int, int>>& route_stack,int direction){
  42. int dx,dy;
  43. switch (direction) {
  44. case UP:
  45. dx=-1;
  46. dy=0;
  47. break;
  48. case DOWN:
  49. dx=1;
  50. dy=0;
  51. break;
  52. case LEFT:
  53. dx=0;
  54. dy=-1;
  55. break;
  56. case RIGHT:
  57. dx=0;
  58. dy=1;
  59. break;
  60. default:
  61. dx=n;
  62. dy=m;
  63. break;
  64. }
  65. std::pair<int, int> next=std::make_pair(route_stack.top().first+dx, route_stack.top().second+dy);
  66. if(isOut(next)){
  67. return false;
  68. }
  69. route_stack.push(next);
  70. maze[route_stack.top().first][route_stack.top().second]=2;
  71. if(route_stack.top().first==n-1){
  72. return true;
  73. }
  74. int* availDir;
  75. switch (direction) {
  76. case UP:
  77. availDir=fromUp;
  78. break;
  79. case DOWN:
  80. availDir=fromDown;
  81. break;
  82. case LEFT:
  83. availDir=fromLeft;
  84. break;
  85. case RIGHT:
  86. availDir=fromRight;
  87. break;
  88. default:
  89. availDir=NULL;
  90. break;
  91. }
  92. for(int i=0;i<3;i++){
  93. if(step(route_stack, availDir[i])){
  94. return true;
  95. }
  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. if(n==1){
  107. for(int i=0;i<m;i++){
  108. if(maze[0][i]==0){
  109. return true;
  110. }
  111. }
  112. return false;
  113. }
  114. else{
  115. bool answer=true;
  116. for(int i=0;i<m;i++){
  117. if(maze[0][i]==0){
  118. std::stack<std::pair<int, int>> route_stack;
  119. maze[0][i]=2;
  120. route_stack.push(std::make_pair(0, i));
  121. if(!step(route_stack, DOWN)){
  122. answer= false;
  123. break;
  124. }
  125. }
  126. }
  127. return answer;
  128. }
  129. }
  130. void printAnswer(std::ofstream& fout){
  131. if(getAnswer()==false){
  132. fout<<"Impossible\n";
  133. } else{
  134. fout<<"Possible\n";
  135. }
  136. // for(int i=0;i<n;i++){
  137. // for(int j=0;j<m;j++){
  138. // fout<<maze[i][j];
  139. // }
  140. // fout<<"\n";
  141. // }
  142. }
  143. };
  144.  
  145. int main(int argc, const char * argv[]) {
  146. std::ifstream fin("in.txt");
  147. std::ofstream fout("out.txt");
  148. Maze mz;
  149. mz.readMaze(fin);
  150. mz.printAnswer(fout);
  151. return 0;
  152. }
Advertisement
Add Comment
Please, Sign In to add comment