#include <iostream> #include <fstream> #include <queue> #include <string> #include <vector> using namespace std; ifstream f("fisier.txt"); struct point{ int i, j, value; }; void citire(vector< vector<int> > &v, int n, int m){ int i, j, nr; char line[101]; for(i=0; i<n; i++){ cin.getline(line, 255); for(j=0; j<m; j++){ if(line[j]=='.') nr=0; else nr=-1; v[i][j]=nr; } } } void afisare(vector< vector<int> > &v, int n, int m){ int i, j; for(i=0; i<n; i++){ for(j=0; j<m; j++) cout << v[i][j]; cout << endl; } } int solution(vector< vector<int> > &v, int n, int m){ int finishPoint=0, actualI, actualJ; queue<point> coada; point start, lastElement, newElement; start.i = 0; start.j = 0; start.value = 1; v[0][0]=1; coada.push(start); while(!coada.empty()){ lastElement = coada.front(); finishPoint = lastElement.value; coada.pop(); actualI = lastElement.i; actualJ = lastElement.j; if(actualJ+1<m) if(v[actualI][actualJ+1]==0){ newElement.i = actualI; newElement.j = actualJ+1; newElement.value = finishPoint+1; v[actualI][actualJ+1] = finishPoint+1; coada.push(newElement); } if(actualI+1<n) if(v[actualI+1][actualJ]==0){ newElement.i = actualI+1; newElement.j = actualJ; newElement.value = finishPoint+1; v[actualI+1][actualJ] = finishPoint+1; coada.push(newElement); } } return finishPoint; } int main() { int n, m; cin >> n >> m; cin.get(); vector< vector<int> > v(n,vector<int>(m)); citire(v, n, m); cout << solution(v, n, m); return 0; }