Pagini recente » Cod sursa (job #1500175) | Cod sursa (job #2079834) | Cod sursa (job #2556831) | Cod sursa (job #1367489) | Cod sursa (job #2867953)
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int main()
{
int r=0,c=0;
fin>>r>>c;
vector<vector<int>> mb(r,vector<int>(c,true));
vector<vector<int>> m(r,vector<int>(c,r*c+1));
vector<pair<int,int>> rvs={make_pair(0,-1),make_pair(0,1),make_pair(-1,0),make_pair(1,0)};
pair<int,int> I(-1,-1),O(-1,-1);
queue<pair<int,int>> ds;
for(int i=0;i<r;i++) {
for(int j=0;j<c;j++) {
char c='0';
fin>>c;
if(c=='*') {
m[i][j]=-1;
}
else {
if(c=='D') {
ds.push(make_pair(i,j));
m[i][j]=0;
}
else {
if(c=='I') {
I.first=i;
I.second=j;
}
else if(c=='O') {
O.first=i;
O.second=j;
}
}
}
}
}
while(!ds.empty()) {
pair<int,int> pos(ds.front().first,ds.front().second);
for(auto rv:rvs) {
pair<int,int> av(pos.first,pos.second);
av.first+=rv.first;
av.second+=rv.second;
if(av.first>=0&&av.second>=0&&av.first<r&&av.second<c) {
if(m[av.first][av.second]!=-1&&mb[av.first][av.second]) {
m[av.first][av.second]=min(m[av.first][av.second],m[pos.first][pos.second]+1);
ds.push(make_pair(av.first,av.second));
mb[av.first][av.second]=false;
}
}
}
ds.pop();
}
int mi=0,Ma=r*c;
while(Ma>mi) {
int mid=(Ma+mi)/2;
vector<vector<int>> mv(r,vector<int>(c,false));
queue<pair<int,int>> q;
q.push(make_pair(I.first,I.second));
while(!q.empty()) {
pair<int,int> pos(q.front().first,q.front().second);
for(auto rv:rvs) {
pair<int,int> av(pos.first,pos.second);
av.first+=rv.first;
av.second+=rv.second;
if(av.first>=0&&av.second>=0&&av.first<r&&av.second<c) {
if(m[av.first][av.second]>mid&&!mv[av.first][av.second]) {
m[av.first][av.second]=min(m[av.first][av.second],m[pos.first][pos.second]+1);
q.push(make_pair(av.first,av.second));
mv[av.first][av.second]=true;
}
}
}
q.pop();
}
if(mv[O.first][O.second]) {
mi=mid+1;
}
else {
Ma=mid;
}
}
fout<<((Ma==0)?Ma:-1);
return 0;
}