Advertisement
Infernale

Maze [NCTU Floor 21]

Dec 21st, 2019
489
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.87 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <stack>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. #define right 1
  8. #define down 2
  9. #define left 3
  10. #define up 4
  11.  
  12. int row, col;
  13.  
  14. struct Point{
  15.     int x, y, direction;
  16.     Point(int x, int y){
  17.         this->x = x;
  18.         this->y = y;
  19.         direction = 1;
  20.     }
  21. };
  22.  
  23. void printSolution(vector <string> map, stack <Point> path){
  24.     while(!path.empty()){
  25.         Point point = path.top(); path.pop();
  26.         if(map[point.x][point.y] != 'S' && map[point.x][point.y] != 'E')
  27.             map[point.x][point.y] = '1';
  28.     }
  29.     for(int i = 0; i < row; i++){
  30.         for(int j = 0; j < col; j++){
  31.             cout << map[i][j] << " ";
  32.         }
  33.     }
  34. }
  35.  
  36. void transverse(vector <string> map, int n, int m, vector <vector<bool>> visited, stack <Point> nodes){
  37.     Point point(n, m);
  38.     nodes.push(point);
  39.     while(!nodes.empty()){
  40.         Point temp = nodes.top();
  41.  
  42.         int dir = temp.direction;
  43.         int x = temp.x, y = temp.y;
  44.         temp.direction++;
  45.  
  46.         nodes.pop();
  47.         nodes.push(temp);
  48.         //cout << "X = " << x << " Y = " << y << endl;
  49.         //cout << "Direction : " << dir << endl;
  50.         if(map[x][y] == 'E')
  51.             return printSolution(map, nodes);
  52.         if(dir == right){
  53.             if(map[x][y + 1] != '2' && !visited[x][y + 1]){
  54.                 Point p(x, y + 1);
  55.                 visited[x][y + 1] = true;
  56.                 nodes.push(p);
  57.                 //cout << "Right" << endl;
  58.             }
  59.         }
  60.         else if(dir == down){
  61.             if(map[x + 1][y] != '2' && !visited[x + 1][y]){
  62.                 Point p(x + 1, y);
  63.                 visited[x + 1][y] = true;
  64.                 nodes.push(p);
  65.                 //cout << "Bottom" << endl;
  66.             }
  67.         }
  68.         else if(dir == left){
  69.             if(map[x][y - 1] != '2' && !visited[x][y - 1]){
  70.                 Point p(x, y - 1);
  71.                 visited[x][y - 1] = true;
  72.                 nodes.push(p);
  73.                 //cout << "Left" << endl;
  74.             }
  75.         }
  76.         else if(dir == up){
  77.             if(map[x - 1][y] != '2' && !visited[x - 1][y]){
  78.                 Point p(x - 1, y);
  79.                 visited[x - 1][y] = true;
  80.                 nodes.push(p);
  81.                 //cout << "Up" << endl;
  82.             }
  83.         }
  84.         else{
  85.             visited[x][y] = false;
  86.             nodes.pop();
  87.         }
  88.     }
  89.     cout << "No solution found! End point not reachable!" << endl;
  90. }
  91.  
  92. void solve(vector <string> map){
  93.     int x = -1, y = -1;
  94.     for(int i = 0; i < row && x == -1; i++){
  95.         for(int j = 0; j < col; j++){
  96.             if(map[i][j] == 'S'){
  97.                 x = i;
  98.                 y = j;
  99.                 break;
  100.             }
  101.         }
  102.     }
  103.     //cout << x << " " << y << endl;
  104.     vector <vector<bool> > visited(row, vector<bool>(col, false));
  105.     stack <Point> nodes;
  106.     transverse(map, x, y, visited, nodes);
  107. }
  108.  
  109. int main(){
  110.     cin >> col >> row;
  111.     char ch;
  112.     vector <string> map;
  113.     for(int i = 0; i < row; i++){
  114.         string str = "";
  115.         for(int j = 0; j < col; j++){
  116.             cin >> ch;
  117.             str += ch;
  118.         }
  119.         map.push_back(str);
  120.     }
  121.     solve(map);
  122.     return 0;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement