Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <queue>
- #include <list>
- using namespace std;
- class Coordonnees
- {
- public:
- Coordonnees(int xx = 0, int yy = 0);
- friend bool operator==(Coordonnees const& a, Coordonnees const& b);
- int x, y;
- };
- class Element
- {
- public:
- Element(Coordonnees coord = Coordonnees(), int cases = 0);
- Coordonnees position;
- int parcouru;
- };
- int cheminPlusCourt(vector<vector<int> > const& laby, int lignes, int colones);
- bool valable(vector<vector<int> > const& laby, Coordonnees suivante, int lignes, int colones);
- int main()
- {
- int lignes(0), colones(0), buffer(0);
- vector<vector<int> > laby;
- cin >> lignes;
- cin >> colones;
- for(int i(0); i < lignes; i ++)
- {
- laby.push_back(vector<int>());
- for(int j(0); j < colones; j ++)
- {
- cin >> buffer;
- laby[i].push_back(buffer);
- }
- }
- cout << cheminPlusCourt(laby, lignes, colones);
- return 0;
- }
- int cheminPlusCourt(vector<vector<int> > const& laby, int lignes, int colones)
- {
- queue<Element> file;
- list<Coordonnees> visite;
- Coordonnees fin(lignes - 1, colones - 1);
- Element actuel;
- bool stop(false);
- file.push(Element());
- while(!file.empty())
- {
- actuel = file.pop();
- for(list<Coordonnees>::iterator it(visite.begin()); it != visite.end(); it ++)
- {
- if(*it == actuel.position)
- {
- stop = true;
- break;
- }
- }
- if(!stop)
- {
- visite.push_back(actuel.position);
- if(actuel.position == fin)
- return actuel.parcouru;
- if(valable(laby, Coordonnees(actuel.position.x - 1, actuel.position.y), lignes, colones))
- file.push(Element(Coordonnees(actuel.position.x - 1, actuel.position.y), actuel.parcouru + 1));
- if(valable(laby, Coordonnees(actuel.position.x + 1, actuel.position.y), lignes, colones))
- file.push(Element(Coordonnees(actuel.position.x + 1, actuel.position.y), actuel.parcouru + 1));
- if(valable(laby, Coordonnees(actuel.position.x, actuel.position.y - 1), lignes, colones))
- file.push(Element(Coordonnees(actuel.position.x, actuel.position.y - 1), actuel.parcouru + 1));
- if(valable(laby, Coordonnees(actuel.position.x, actuel.position.y - 1), lignes, colones))
- file.push(Element(Coordonnees(actuel.position.x, actuel.position.y + 1), actuel.parcouru + 1));
- }
- }
- return -1;
- }
- bool valable(vector<vector<int> > const& laby, Coordonnees suivante, int lignes, int colones)
- {
- if(suivante.x >= 0 && suivante.x < lignes && suivante.y >= 0 && suivante.y <= 0)
- if(laby[suivante.x][suivante.y] == 0)
- return true;
- return false;
- }
- Coordonnees::Coordonnees(int xx, int yy) : x(xx), y(yy)
- {}
- bool operator==(Coordonnees const& a, Coordonnees const& b)
- {
- if(a.x == b.x && a.y == b.y)
- return true;
- else
- return false;
- }
- Element::Element(Coordonnees coord, int cases) : position(coord), parcouru(cases)
- {}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement