Pagini recente » Cod sursa (job #961672) | Cod sursa (job #1732990) | Cod sursa (job #1592889) | Cod sursa (job #900566) | Cod sursa (job #2161231)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
const int INF = 0x3f3f3f3f;
struct cell{
int val, mini;
bool obj;
cell(){ //0->Nothin, 1->Obstacle
obj = false;
val = INF;
mini = -INF;
}
};
int n, m;
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
vector < vector< cell > > lab; //Matrice
queue < pair<int, int> > Q; //Dragonii + Walker
pair <int, int> S, F; //Start Finish
bool okGrid(int i, int j)
{
return (i>=0 && i<n && j>=0 && j<m);
}
int main()
{
int i, j, dir, x, y;
char c;
f>>n>>m; //Citire
for(i=1;i<=n;++i){
vector <cell> aux;
for(j=1;j<=m;++j){
cell x;
f>>c;
if(c=='*' || c=='D' || c=='I') x.obj = true;
if(c=='I') {
S = make_pair(i - 1, j - 1);
x.val = INF;
}
else if(c=='O') F = make_pair(i - 1, j - 1);
else if(c=='D') {
Q.push(make_pair(i - 1, j - 1));
x.val = 0;
}
aux.push_back(x);
}
lab.push_back(aux);
f.get(); //EOL
}
while(!Q.empty()){ //Dragoni
i = Q.front().first;
j = Q.front().second;
Q.pop();
for(dir=0;dir<4;++dir){
x = i + dx[dir];
y = j + dy[dir];
if(okGrid(x, y) && !lab[x][y].obj && lab[x][y].val > lab[i][j].val + 1){
lab[x][y].val = lab[i][j].val + 1;
Q.push(make_pair(x, y));
}
}
}
Q.push(make_pair(S.first, S.second)); //MaxMinDist
lab[S.first][S.second].mini = lab[S.first][S.second].val;
while(!Q.empty()){
i = Q.front().first;
j = Q.front().second;
Q.pop();
for(dir=0;dir<4;++dir){
x = i + dx[dir];
y = j + dy[dir];
if(okGrid(x, y) && !lab[x][y].obj && lab[x][y].mini < min(lab[x][y].val, lab[i][j].mini)){
lab[x][y].mini = min(lab[x][y].val, lab[i][j].mini);
Q.push(make_pair(x, y));
}
}
}
g<<lab[F.first][F.second].mini;
return 0;
}