Cod sursa(job #1824431)

Utilizator 3DwArDPauliuc Edward 3DwArD Data 7 decembrie 2016 20:34:46
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.29 kb
#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;
}