Pagini recente » Cod sursa (job #2688259) | Cod sursa (job #1578113) | Cod sursa (job #426959) | Cod sursa (job #285207) | Cod sursa (job #3242542)
#include <fstream>
#include<vector>
#include<queue>
#include<string>
using namespace std;
#define int short
ifstream cin("barbar.in");
ofstream cout("barbar.out");
vector<vector<pair<int,int>>> val;
vector<string> mat;
vector<pair<int,int>> vdir={{0,1},{1,0},{0,-1},{-1,0}};
struct Data{
int i,j,val;
};
queue<Data> qd;
signed main()
{
int n,m,i,j,si,sj,ei,ej;
string s;
cin>>n>>m;
val=vector<vector<pair<int,int>>>(n,vector<pair<int,int>>(m,{INT16_MAX,0}));
for(i=0;i<n;i++){
cin>>s;
for(j=0;j<n;j++){
if(s[j]=='I'){
si=i;
sj=j;
}
else if(s[j]=='O'){
ei=i;
ej=j;
}
else if(s[j]=='D'){
qd.push({i,j,0});
val[i][j].first=0;
}
}
mat.push_back(s);
}
while(!qd.empty()){
Data dt=qd.front();
qd.pop();
for(auto dir:vdir){
i=dt.i+dir.first;
j=dt.j+dir.second;
if(i>=0&&i<n&&j>=0&&j<m&&mat[i][j]!='*'&&val[i][j].first>dt.val+1){
val[i][j].first=dt.val+1;
qd.push({i,j,dt.val+1});
}
}
}
qd.push({si,sj,INT16_MAX});
bool ok=false;
while(!qd.empty()){
Data dt=qd.front();
if(dt.i==ei&&dt.j==ej){
ok=true;
}
qd.pop();
for(auto dir:vdir){
i=dt.i+dir.first;
j=dt.j+dir.second;
if(i>=0&&i<n&&j>=0&&j<m&&mat[i][j]!='*'&&val[i][j].second<min(dt.val,val[i][j].first)){
val[i][j].second=min(dt.val,val[i][j].first);
qd.push({i,j,val[i][j].second});
}
}
}
if(!ok){
val[ei][ej].second=-1;
}
cout<<val[ei][ej].second;
return 0;
}