Sigui una matriu d’enters. Si un valor de la matriu és negatiu, direm que en aquella posició hi ha una pedra. Si el valor és més gran o igual que zero, llavors direm que en aquella posició hi ha un premi.
Heu de fer una funció que rebi una matriu M, un enter
potencia > 0, un enter objectiu > 0 i un
string recorregut que podrà contenir només els caràcters
N,S,E,O. Aquests valors determinen un recorregut per la
matriu: partint de la posició inicial
,
si rebem una N haurem de pujar una fila, si rebem una
S haurem de baixar una fila, si rebem una O
haurem d’anar una columna a l’esquerra, i si rebem una E
haurem d’anar una columna a la dreta. Òbviament, no podem sortir de la
matriu. Si el caràcter ens fa sortir de la matriu, ens haurem de quedar
a la mateixa posició.
La funció haurà de dir si amb el recorregut podrem
aconseguir recollir prou premis per tal d’arribar a
l’objectiu o no.
La posició de partida és . A més, aquesta posició no contindrà mai cap pedra, només un premi.
Cada vegada que passem per una posició podrà passar
Que hi hagi una pedra (un valor estrictament més petit que zero).
En aquest cas, disminuïm la potencia en tantes unitats com
el valor absolut d’aquesta posició.
Que hi hagi un premi. En aquest cas, acumulem aquest valor.
Podem passar per la mateixa posició més d’una vegada, depenent del
que ens mani fer el recorregut. I cada vegada que hi
passem, podrem acumular el premi. Ara bé, si ens trobem en una posicio
donada i el seguent moviment de recorregut ens fa anar fora
de la matriu, el que farem serà no moure’ns de posició, i no hi haurà ni
acumulació de premi (si ens trobem en un premi), ni reducció de potència
(si ens trobem en una pedra).
La funció tornarà ACONSEGUIT si el recorregut és capaç
de recollir almenys tants premis com objectiu. En canvi, si
ha passat per tantes pedres que ha esgotat tota la seva
potencia, haurà de tornar ESGOTAT. Si després
d’exhaurir el recorregut, no ha pogut recollir prou premis com
objectiu, llavors haurà de tornar
NO HI ARRIBEM.
Per exemple, si tenim la matriu
| 1 | 2 | -1 | 3 |
| -1 | 1 | 1 | -4 |
| 2 | 4 | -1 | 2 |
| 3 | -1 | -1 | 2 |
| 1 | 0 | 1 | 1 |
i tenim que potencia = 6, objectiu = 10 i
recorregut = EESESSS, començarem a la posició
.
El recorregut serà aquest:
| Recorregut | Posició | M[i][j] | Potència | Acumulat |
|---|---|---|---|---|
| E | (0,1) | 2 | 6 | 3 |
| E | (0,2) | -1 | 5 | 3 |
| S | (1,2) | 1 | 5 | 4 |
| E | (1,3) | -4 | 1 | 4 |
| S | (2,3) | 2 | 1 | 6 |
| S | (3,3) | 2 | 1 | 8 |
| S | (4,3) | 1 | 1 | 9 |
El resultat serà NO HI ARRIBEM perquè haurem exhaurit el
recorregut, però no haurem aconseguit prou premis com l’objectiu ens
demanava.
Fes una funció matriu_laberint amb la següent declaració
i especificació:
/*
* PRE: M.size() > 0 and M[0].size() > 0, és una matriu d'enters.
* M[0][0] >= 0.
* potencia > 0, objectiu > 0.
* recorregut.size() > 0 i recorregut només conté 'N','S','E','O'.
*
* POST: Retorna ACONSEGUIT si el recorregut és capaç de recollir
* almenys tants premis com objectiu.
* Retorna ESGOTAT si recull tantes pedres o més que potència.
* Retorna NO HI ARRIBEM si el recorregut no aconsegueix recollir
* tants premis com objectiu.
*/
string matriu_laberint(const Matriu& M,int potencia, int objectiu,
const string& recorregut)
Només cal enviar la funció que us demanem (i les funcions que hagueu pogut declarat vosaltres).
A més, al fitxer que envieu cal que també hi hagi això:
#include <iostream>
#include <vector>
using namespace std;
typedef vector <int> Vector;
typedef vector<Vector> Matriu;
No es pot fer servir l’ordenació del C++:
std::sort. Tampoc no es pot fer servir el mètode
push_back() de la classe vector.
Si voleu, podeu fer servir les funcions min,
max o swap.
L’entrada és una matriu d’enters no buida, un enter potencia, un enter objectiu i un string recorregut. A la posició M[0][0] no hi ha una pedra. , . i recorregut només conté ’N’,’S’,’E’,’O’.
Retorna ACONSEGUIT si el recorregut és capaç de recollir almenys tants premis com objectiu. Retorna ESGOTAT si recull tantes pedres o més que potència. Retorna NO HI ARRIBEM si el recorregut no aconsegueix recollir tants premis com objectiu.
Input
5 4 1 2 -1 3 -1 1 1 -4 2 4 -1 2 3 -1 -1 2 1 0 1 1 10 10 ESENOSSSSOOONNE 2 10 EESESSSOOOONN 6 10 EESESSS
Output
POTENCIA: 10 OBJECTIU: 10 RECORREGUT: ESENOSSSSOOONNE RESULTAT: ACONSEGUIT POTENCIA: 2 OBJECTIU: 10 RECORREGUT: EESESSSOOOONN RESULTAT: ESGOTAT POTENCIA: 6 OBJECTIU: 10 RECORREGUT: EESESSS RESULTAT: NO HI ARRIBEM
Input
5 4 0 2 4 8 29 -1 4 -1 28 39 35 15 27 -7 36 -6 25 22 20 20 10 90 SEOOSSSOEESEEENNN
Output
POTENCIA: 10 OBJECTIU: 90 RECORREGUT: SEOOSSSOEESEEENNN RESULTAT: ACONSEGUIT