Pagini recente » Cod sursa (job #2766879) | Cod sursa (job #3286716) | Cod sursa (job #2834766) | Cod sursa (job #2991269) | Cod sursa (job #1907232)
#include <fstream>
#include <queue>
#include <bitset>
#include <cstdio>
#include <cstring>
#define NMAx 1024
#define ff first
#define ss second
#define mkp make_pair
#define min(a,b) (a<b?a:b)
using namespace std;
queue < pair<short,short> > Q;
pair <short,short> Start,Finish;
short N,M,Sol,A[NMAx][NMAx],Dx[]={1,-1,0,0},Dy[]={0,0,1,-1};
bitset <NMAx> viz[NMAx];
char S[NMAx];
bool Fill(int Val) {
int k,X,Y,Xnou,Ynou;
memset(viz,0,sizeof(viz));
Q.push(Start);
while(Q.size()) {
X=Q.front().ff;
Y=Q.front().ss;
Q.pop();
for(k=0;k<4;k++) {
Xnou=X+Dx[k];
Ynou=Y+Dy[k];
if(!viz[Xnou][Ynou]&&A[Xnou][Ynou]>=Val) {
viz[Xnou][Ynou]=1;
Q.push(mkp(Xnou,Ynou));
}
}
}
if(viz[Finish.ff][Finish.ss])
return 1;
return 0;
}
int Search() {
int Right,Step,i;
Right=min(A[Start.ff][Start.ss],A[Finish.ff][Finish.ss]);
for(Step=1;Step<Right;Step<<=1);
for(i=0;Step;Step>>=1)
if(Step+i<=Right&&Fill(i+Step))
i+=Step;
return i+Step;
}
void Lee() {
int k,X,Y,Xnou,Ynou;
while(Q.size()) {
X=Q.front().ff;
Y=Q.front().ss;
Q.pop();
for(k=0;k<4;k++) {
Xnou=X+Dx[k];
Ynou=Y+Dy[k];
if(!A[Xnou][Ynou]) {
A[Xnou][Ynou]=A[X][Y]+1;
Q.push(mkp(Xnou,Ynou));
}
if(A[Xnou][Ynou]>A[X][Y]+1)
A[Xnou][Ynou]=A[X][Y]+1;
}
}
}
void bordare() {
for(int i=0;i<=M+1;i++)
A[0][i]=A[N+1][i]=-1;
for(int i=0;i<=N+1;i++)
A[i][0]=A[i][M+1]=-1;
}
void citire() {
int i,j;
ifstream in("barbar.in");
in>>N>>M;
in.getline(S,3);
for(i=1;i<=N;i++) {
in.getline(S+1,NMAx);
for(j=1;j<=M;j++)
switch(S[j]) {
case '.':break;
case '*':A[i][j]=-1;break;
case 'D':A[i][j]=1;Q.push(mkp(i,j));break;
case 'I':Start=mkp(i,j);break;
case 'O':Finish=mkp(i,j);break;
}
}
in.close();
}
void afis() {
ofstream out("barbar.out");
out<<Sol<<'\n';
out.close();
}
int main() {
citire();
bordare();
Lee();
Sol=Search()-1;
afis();
return 0;
}