# Robot Programmabile

**URL:** <https://forum.olinfo.it/t/robot-programmabile/4205>\
**Category:** Aiuto\
**Created:** [5 Dicembre 2016, 10:33pm UTC](https://forum.olinfo.it/t/robot-programmabile/4205 "2016-12-05T22:33:14Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![fenixreborn00](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/f/b38774/32.png) [@fenixreborn00](https://forum.olinfo.it/u/fenixreborn00)\
**Post date:** [5 Dicembre 2016, 10:33pm UTC](https://forum.olinfo.it/t/robot-programmabile/4205/1 "2016-12-05T22:33:14Z")

</div>

Ciao a tutti. In questi giorni mi sto allenando per le olimpiadi risolvendo alcuni esercizi.  
Mi sono bloccato sull’esercizio Robot Programmabile. Riesco ad ottenere solo 40/100 a causa dell’errore:

Execution killed with signal 11 (could be triggered by violating memory limits)

Vorrei sapere come posso ottimizzare il mio codice perchè sono giorni che non ne esco fuori.

```auto
#include <stdio.h>
#include <assert.h>
#include <vector>

#define MAXN 1000000
#define MAXM 100000

enum Direction {UP, DOWN, LEFT, RIGHT};
struct Robot
{
	int x, y; 
	Direction direction; 
};

typedef struct{
    int x, y; 
} point;

point passeggia(int N, int M, char P[], int S[], int E[]) {
	
    std::vector<char>command; 
    Robot robot;
    
    robot.x = 0;
    robot.y = 0;
    robot.direction = RIGHT;

	for (int i = 0; i < M; i++)
	{
		for (int j = S[i]; j <= E[i]; j++)
		{
			command.push_back(P[j]);
		}
	}
	
	for (int i = 0; i < command.size(); i++)
	{
		if (command[i] == 'X')
			break;
			
		switch(command[i])
		{
			case 'R':
				switch (robot.direction)
					{
						case LEFT:
							robot.direction = UP;
							break;
						case RIGHT:
							robot.direction = DOWN;
							break;
						case UP:
							robot.direction = RIGHT;
							break;
						case DOWN:
							robot.direction = LEFT;
							break;
					}
				break;
				
			case 'L':
				switch (robot.direction)
					{
						case LEFT:
							robot.direction = DOWN;
							break;
						case RIGHT:
							robot.direction = UP;
							break;
						case UP:
							robot.direction = LEFT;
							break;
						case DOWN:
							robot.direction = RIGHT;
							break;
					}
				break;
			
			case 'F':
				switch (robot.direction)
					{
						case LEFT:
							robot.x--;
							break;
						case RIGHT:
							robot.x++;
							break;
						case UP:
							robot.y++;
							break;
						case DOWN:
							robot.y--;
							break;
					}
			break;
			
			case 'B':
				switch (robot.direction)
					{
						case LEFT:
							robot.x++;
							break;
						case RIGHT:
							robot.x--;
							break;
						case UP:
							robot.y--;
							break;
						case DOWN:
							robot.y++;
							break;
					}
			break;				
		}
	}
	point p;
	p.x = robot.x;
	p.y = robot.y;
	command.clear();
    return p;
}

char P[MAXN+2];
int S[MAXM], E[MAXM];

int main() {
    FILE *fr, *fw;
    int N, M, i;

    fr = fopen("input.txt", "r");
    fw = fopen("output.txt", "w");
    assert(2 == fscanf(fr, "%d %d\n", &N, &M));
    assert(1 == fscanf(fr, "%s", P));
    for(i=0; i<M; i++)
        assert(2 == fscanf(fr, "%d %d", &S[i], &E[i]));

    point p = passeggia(N, M, P, S, E);
    fprintf(fw, "%d %d\n", p.x, p.y);
    fclose(fr);
    fclose(fw);
    return 0;
}

```

Vi lascio il link del repository Github dove è presente il programma:

> **[erikfazio/OII](https://github.com/erikfazio/OII)**
>
> Risoluzione degli esercizi relativi alle OII - Olimpiadi Italiane a Squadre

---

<div class="post-metadata">

**Author:** ![Venio](https://forum.olinfo.it/user_avatar/forum.olinfo.it/venio/32/116_2.png) [@Venio](https://forum.olinfo.it/u/Venio)\
**Post date:** [7 Dicembre 2016, 11:20pm UTC](https://forum.olinfo.it/t/robot-programmabile/4205/2 "2016-12-07T23:20:19Z")

</div>

A giudicare dall’uso di memoria che indica il correttore, probabilmente superi i limiti di memoria del problema.  
La causa secondo me è l’array dove salvi le mosse da fare, se guardi le assunzioni puo diventare enorme.  
Spero di essere stato d’aiuto 🙂
