Pagini recente » Cod sursa (job #2850553) | Cod sursa (job #2888186) | Cod sursa (job #2727054) | Cod sursa (job #2033553)
#include <bits/stdc++.h>
#define NMAX 1005
#define MOD 666013
#define INF 0x3f3f3f3f
#define x first
#define y second
#define pb push_back
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
char mat[NMAX][NMAX];
bool viz[NMAX][NMAX];
queue<pair<int,int> > Q;
int dlin[4]={0,1,0,-1},startx,starty,finishx,finishy;
int dcol[4]={1,0,-1,0},dist[NMAX][NMAX];
bool check(int verif) {
int x,y,newx,newy,i;
memset(viz,0,sizeof(viz));
Q.push({startx,starty});
viz[startx][starty]=1;
while(!Q.empty()) {
x=Q.front().first;
y=Q.front().second;
Q.pop();
for(i=0;i<4;++i) {
newx=x+dlin[i];
newy=y+dcol[i];
if(!viz[newx][newy] && mat[newx][newy]!='*' && dist[newx][newy]>=verif) {
viz[newx][newy]=1;
Q.push({newx,newy});
}
}
}
return viz[finishx][finishy];
}
int main() {
int n,m,i,j,x,y,newx,newy,st,dr,mid,last=-1;
fin>>n>>m;
for(i=1;i<=n;++i) {
for(j=1;j<=m;++j) {
fin>>mat[i][j];
if(mat[i][j]=='I') {
startx=i;
starty=j;
}
else if(mat[i][j]=='O') {
finishx=i;
finishy=j;
}
else if(mat[i][j]=='D') {
Q.push({i,j});
dist[i][j]=1;
}
}
}
for(i=1;i<=n;++i) mat[i][0]=mat[i][m+1]='*';
for(i=1;i<=m;++i) mat[0][i]=mat[n+1][i]='*';
while(!Q.empty()) {
x=Q.front().first;
y=Q.front().second;
Q.pop();
for(i=0;i<4;++i) {
newx=x+dlin[i];
newy=y+dcol[i];
if(mat[newx][newy]!='*' && dist[newx][newy]==0) {
dist[newx][newy]=dist[x][y]+1;
Q.push({newx,newy});
}
}
}
st=1;
dr=INF;
while(st<=dr) {
mid=(st+dr)/2;
if(check(mid)) {
st=mid+1;
last=mid;
}
else dr=mid-1;
}
if(last==-1) fout<<-1;
else fout<<last-1;
return 0;
}