Untitled

mail@pastecode.io avatarunknown
c_cpp
a month ago
3.1 kB
1
Indexable
Never
#include <iostream>

using namespace std;

class Map {
	public:
	int x_max, y_max;
	bool arr[50][100];
	Map () {
		//cout << "Map created" << endl;
		cin >> x_max >> y_max;
		for (int i = 0; i < x_max; i++) {
			for (int j=  0; j < y_max; j++) {
				arr[i][j] = false;
			}
		}

	}

	void writeDanger (int x, int y) {
		arr[x][y] = true;
	}

	bool isDangerous (int x, int y) {
		return arr[x][y];
	}

	bool inBorder (int x, int y) {
		if (x >= 0 && y >= 0) {
			if (x <= x_max && y <= y_max) {
				return true;
			}
			return false;
		}
		return false;
	}
};

Map* world;

class Android {
	public:
	bool alive;
	int pos_x, pos_y;
	char dir;
	string cmd;
	
	Android (int x, int y, char f) {
		alive = true;
		pos_x = x;
		pos_y = y;
		dir = f;
	}

	void Recv_cmd () {
		cin >> cmd;
	}


	void venture () {
		for (int i = 0; i < cmd.length (); i++) {
			//cout << "Now at (" << pos_x << ", " << pos_y << "), facing " << dir << endl;
			if (!alive) break;
			if (cmd[i] != 'F') {
				if (cmd[i] == 'R') {
					//cout << "Turning right" << endl;
					switch (dir) {
						case 'E':
							dir = 'S';
							break;
						case 'S':
							dir = 'W';
							break;
						case 'W':
							dir = 'N';
							break;
						case 'N':
							dir = 'E';
							break;
						default:
							break;
					}
				} else if (cmd[i] == 'L') {
					//cout << "Turning left" << endl;
					switch (dir) {
						case 'E':
							dir = 'N';
							break;
						case 'S':
							dir = 'E';
							break;
						case 'W':
							dir = 'S';
							break;
						case 'N':
							dir = 'W';
							break;
						default:
							break;
					}
				}
			} else {
				//cout << "Moving forward" << endl;

				switch (dir) {
					case 'W':
						if (!world->inBorder (pos_x-1, pos_y))
							alive = false;
						else
							pos_x --;
						break;
					case 'S':
						if (!world->inBorder (pos_x, pos_y-1))
							alive = false;
						else
							pos_y --;
						break;
					case 'E':
						if (!world->inBorder (pos_x+1, pos_y))
							alive = false;
						else
							pos_x ++;
						break;
					case 'N':
						if (!world->inBorder (pos_x, pos_y+1))
							alive = false;
						else
							pos_y ++;
						break;
					default:
						break;
				}
				if (!alive && world->isDangerous (pos_x, pos_y)) {
					//cout << "Not going, cuz it's dangerous" << endl;
					alive = true;
					continue;
				}
			}

		}
	}

};

int main ()
{
	// Variables
	int border_x, border_y;
	int robot_x, robot_y; string robot_dir;

	// init world map
	//cout << "init world map" << endl;
	world = new Map ();

	// init androids and move it
	while (cin >> robot_x >> robot_y >> robot_dir){

		// init bot 
		Android* man = new Android (robot_x, robot_y, robot_dir[0]);
		
		// bot receive cmd
		man->Recv_cmd ();

		// bot move on
		man->venture ();

		// output bot last location
		cout << man->pos_x << ' ' << man->pos_y << ' ' << man->dir;

		// output bot alive status
		if (!man->alive) {
			cout << " LOST";
			world->writeDanger (man->pos_x, man->pos_y);
		}

		// end of line
		cout << endl;


		// clean up
		delete (man);
	}




}