Pagini recente » Cod sursa (job #2784871) | Cod sursa (job #1999619) | Cod sursa (job #3224896) | Cod sursa (job #1258541) | Cod sursa (job #1824431)
#include <bits/stdc++.h>
using namespace std;
#define Rmax 1003
ifstream f("barbar.in");
ofstream g("barbar.out");
int n,m,d[Rmax][Rmax],v[Rmax][Rmax],ai,aj,bi,bj,vm[Rmax][Rmax];
deque <int> di,dj;
int qi[]={-1,0,1,0};
int qj[]={0,1,0,-1};
void bordare(){
for(int i=0;i<=n+1;i++){
d[i][0]=-1;
d[i][m+1]=-1;
v[i][0]=-1;
v[i][m+1]=-1;
}
for(int j=0;j<=m;j++){
d[0][j]=-1;
d[n+1][j]=-1;
v[0][j]=-1;
v[n+1][j]=-1;
}
}
int ver(char x,int i, int j){
if(x=='.')
return 0;
if(x=='D'){
di.push_back(i);
dj.push_back(j);
d[i][j]=-5;
return -1;
}
if(x=='I'){
ai=i;
aj=j;
d[i][j]=-7;
return -3;
}
if(x=='O'){
bi=i;
bj=j;
return 0;
}
if(x=='*'){
return -1;
}
}
void citire(){
f>>n>>m;
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){
char x;
f>>x;
v[i][j]=ver(x,i,j);
if(d[i][j]==0)
d[i][j]=v[i][j];
if(d[i][j]==-7)
d[i][j]=0;
}
}
void leed(){
int ii,jj,ni,nj;
while(!di.empty()){
ii=di.front();
jj=dj.front();
di.pop_front();
dj.pop_front();
for(int dir=0;dir<=3;dir++){
ni=ii+qi[dir];
nj=jj+qj[dir];
if(d[ni][nj]==0)
{
di.push_back(ni);
dj.push_back(nj);
if(d[ii][jj]==-5)
d[ni][nj]=1;
else{
if(d[ni][nj]!=-5)
d[ni][nj]=d[ii][jj]+1;
}
}
}
}
}
void leed2(){
int ii,jj,ni,nj;
while(!di.empty()){
ii=di.front();
jj=dj.front();
di.pop_front();
dj.pop_front();
vector <int> mi,mj;
for(int dir=0;dir<=3;dir++)
{
int k=0;
ni=ii+qi[dir];
nj=jj+qj[dir];
int val=d[ii+qi[dir]][jj+qj[dir]];
if((vm[ni][nj]==0&&v[ni][nj]==0)||(vm[ii][jj]>vm[ni][nj]&&d[ni][nj]>=vm[ii][jj]&&v[ni][nj]==0))
{ vm[ni][nj]=min(vm[ii][jj],d[ni][nj]);
mi.push_back(ni);
mj.push_back(nj);
}
}
if(!mi.empty()){
for(int z=0;z<mi.size()-1;z++){
int mini=0,minj=0;
for(int p=z;p<mi.size();p++)
{
if(vm[mi[p]][mj[p]]<vm[mi[mini]][mj[minj]])
{
mini=p;
minj=p;
}
}
int auxi=mi[z],auxj=mj[z];
mi[z]=mi[mini];
mj[z]=mj[minj];
mi[mini]=auxi;
mj[minj]=auxj;
}
while(!mi.empty())
{
di.push_back(mi.back());
dj.push_back(mj.back());
mi.pop_back();
mj.pop_back();
}
}
}
}
int main()
{
citire();
bordare();
leed();
di.push_back(ai);
dj.push_back(aj);
vm[ai][aj]=d[ai][aj];
leed2();
g<<vm[bi][bj];
return 0;
}