Pagini recente » Cod sursa (job #718184) | Cod sursa (job #522750) | Cod sursa (job #586188) | Cod sursa (job #550233) | Cod sursa (job #1024997)
#include <iostream>
#include <algorithm>
#include <vector>
#include <fstream>
#include <queue>
#define maxn 1000
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int mat[maxn][maxn],mat2[maxn][maxn];
int n,m;
pair<int, int> start,sfarsit;
int Ox[] = {1,0,-1,0};
int Oy[] = {0,1,0,-1};
void bf(vector <pair<int,int> > &dragon){
queue<pair <int,int> > q;
pair<int,int> elem;
int linie,coloana;
for(unsigned int i=0;i<dragon.size();i++)
q.push(dragon[i]);
while(!q.empty()){
elem = q.front();
q.pop();
for(int i=0;i<4;i++){
linie = elem.first+Ox[i];
coloana = elem.second + Oy[i];
if(linie>=0 && linie<n && coloana>=0 && coloana<m)
if(mat[linie][coloana]==0){
mat[linie][coloana] = mat[elem.first][elem.second] + 1;
q.push(make_pair(linie,coloana));
}
}
}
}
bool valid(int val){
queue<pair <int,int> > q;
pair<int,int> elem;
int linie,coloana;
if(mat[start.first][start.second] < val)
return false;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
mat2[i][j] = mat[i][j];
q.push(start);
mat2[start.first][start.second] = -1;
while (!q.empty()){
elem = q.front();
q.pop();
for(int i=0;i<4;i++){
linie = elem.first + Ox[i];
coloana = elem.second + Oy[i];
if(linie>=0 && linie<n && coloana>=0 && coloana<m)
if(mat2[linie][coloana] > val){
mat2[linie][coloana] = 1;
q.push(make_pair(linie,coloana));
if(linie==sfarsit.first && coloana ==sfarsit.second)
return true;
}
}
}
return false;
}
int main()
{
char x;
vector <pair<int,int> > dragon;
f >> n >> m;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
f >> x;
if(x=='.'){
mat[i][j]=0;
}
if(x=='D'){
mat[i][j]=1;
dragon.push_back(make_pair(i,j));
}
if(x=='I'){
start = make_pair(i,j);
}
if(x=='O'){
sfarsit = make_pair(i,j);
}
if(x=='*'){
mat[i][j]=1;
}
}
bf(dragon);
int st,dr,mij,rez;
rez=0;
st=1;
dr=max(n,m);
while(st<=dr){
mij=(st+dr)/2;
if(valid(mij)){
rez = mij;
st = mij+1;
}
else
dr = mij-1;
}
if(rez)
g << rez;
else
g << "-1";
return 0;
}