CCCPaste

Maze [NCTU Floor 21]

#include 
#include 
#include 
#include 
using namespace std;

#define right 1
#define down 2
#define left 3
#define up 4

int row, col;

struct Point{
	int x, y, direction;
	Point(int x, int y){
		this->x = x;
		this->y = y;
		direction = 1;
	}
};

void printSolution(vector  map, stack  path){
	while(!path.empty()){
		Point point = path.top(); path.pop();
		if(map[point.x][point.y] != 'S' && map[point.x][point.y] != 'E')
			map[point.x][point.y] = '1';
	}
	for(int i = 0; i < row; i++){
		for(int j = 0; j < col; j++){
			cout << map[i][j] << " ";
		}
	}
}

void transverse(vector  map, int n, int m, vector > visited, stack  nodes){
	Point point(n, m);
	nodes.push(point);
	while(!nodes.empty()){
		Point temp = nodes.top();

		int dir = temp.direction;
		int x = temp.x, y = temp.y;
		temp.direction++;

		nodes.pop();
		nodes.push(temp);
		//cout << "X = " << x << " Y = " << y << endl;
		//cout << "Direction : " << dir << endl;
		if(map[x][y] == 'E')
			return printSolution(map, nodes);
		if(dir == right){
			if(map[x][y + 1] != '2' && !visited[x][y + 1]){
				Point p(x, y + 1);
				visited[x][y + 1] = true;
				nodes.push(p);
				//cout << "Right" << endl;
			}
		}
		else if(dir == down){
			if(map[x + 1][y] != '2' && !visited[x + 1][y]){
				Point p(x + 1, y);
				visited[x + 1][y] = true;
				nodes.push(p);
				//cout << "Bottom" << endl;
			}
		}
		else if(dir == left){
			if(map[x][y - 1] != '2' && !visited[x][y - 1]){
				Point p(x, y - 1);
				visited[x][y - 1] = true;
				nodes.push(p);
				//cout << "Left" << endl;
			}
		}
		else if(dir == up){
			if(map[x - 1][y] != '2' && !visited[x - 1][y]){
				Point p(x - 1, y);
				visited[x - 1][y] = true;
				nodes.push(p);
				//cout << "Up" << endl;
			}
		}
		else{
			visited[x][y] = false;
			nodes.pop();
		}
	}
	cout << "No solution found! End point not reachable!" << endl;
}

void solve(vector  map){
	int x = -1, y = -1;
	for(int i = 0; i < row && x == -1; i++){
		for(int j = 0; j < col; j++){
			if(map[i][j] == 'S'){
				x = i;
				y = j;
				break;
			}
		}
	}
	//cout << x << " " << y << endl;
	vector  > visited(row, vector(col, false));
	stack  nodes;
	transverse(map, x, y, visited, nodes);
}

int main(){
	cin >> col >> row;
	char ch;
	vector  map;
	for(int i = 0; i < row; i++){
		string str = "";
		for(int j = 0; j < col; j++){
			cin >> ch;
			str += ch;
		}
		map.push_back(str);
	}
	solve(map);
	return 0;
}