Pagini recente » Cod sursa (job #393835) | Cod sursa (job #784290) | Cod sursa (job #2647262) | Cod sursa (job #3154559) | Cod sursa (job #2740188)
#include <bits/stdc++.h>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
vector<int> dist(1000000);
int r,c,s,inc,fin,maxx;
char ce;
queue<int> q;
vector<int> d;
void bfs(){
while(!q.empty()){
int n=q.front();
q.pop();
int x=n-1;
if(n%c!=0&&dist[x]==0){
q.push(x);
dist[x]=dist[n]+1;
}
x=n+1;
if(x%c!=0&&dist[x]==0){
q.push(x);
dist[x]=dist[n]+1;
}
x=n-c;
if(x>=0&&dist[x]==0){
q.push(x);
dist[x]=dist[n]+1;
}
x=n+c;
if(x<s&&dist[x]==0){
q.push(x);
dist[x]=dist[n]+1;
}
}
}
bool rez(){
q.push(inc);
vector<bool> viz(s);
viz[inc]=1;
while(!q.empty()){
int n=q.front();
q.pop();
int x=n-1;
if(n%c!=0&&viz[x]==0){
if(dist[x]>=maxx){
if(x==fin){
return 1;
}
q.push(x);
viz[x]=1;
}
}
x=n+1;
if(x%c!=0&&viz[x]==0){
if(dist[x]>=maxx){
if(x==fin){
return 1;
}
q.push(x);
viz[x]=1;
}
}
x=n-c;
if(x>=0&&viz[x]==0){
if(dist[x]>=maxx){
if(x==fin){
return 1;
}
q.push(x);
viz[x]=1;
}
}
x=n+c;
if(x<s&&viz[x]==0){
if(dist[x]>=maxx){
if(x==fin){
return 1;
}
q.push(x);
viz[x]=1;
}
}
}
return 0;
}
int main(){
in>>r>>c;
s=r*c;
for(int i=0;i<s;i++){
in>>ce;
if(ce=='I'){
inc=i;
}else
if(ce=='O'){
fin=i;
}else
if(ce=='D'){
d.push_back(i);
q.push(i);
}else
if(ce=='*'){
dist[i]=-1;
}
}
bfs();
for(auto i:d)dist[i]=-1;
if(dist[inc]>dist[fin])maxx=dist[fin];
else maxx=dist[inc];
while(!rez()){
maxx--;
}
out<<maxx;
}