Cod sursa(job #1334094)

Utilizator cautionPopescu Teodor caution Data 3 februarie 2015 21:36:05
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 6.03 kb
#include <fstream>
using namespace std;
char map[1001][1001];
short drake_map[1001][1001];
short move_map[1001][1001];
short que[5000000][3];
int main()
{
    ifstream in("barbar.in");
    ofstream out("barbar.out");
    short n, m;
    short in_x, in_y, out_x, out_y;
    short que_bot=0, que_top=0;
    in>>n>>m;
    for(short i=1; i<=n; ++i)
        in>>(map[i]+1);
    for(short i=1; i<=n; ++i)
    {
        for(short j=1; j<=m; ++j)
        {
            drake_map[i][j]=-1;
            move_map[i][j]=-1;
            switch(map[i][j])
            {
            case 'D':
                que[que_top][0]=i;
                que[que_top][1]=j;
                que[que_top][2]=0;
                drake_map[i][j]=0;
                ++que_top;
                break;
            case 'I':
                in_x=i;
                in_y=j;
                break;
            case 'O':
                out_x=i;
                out_y=j;
                break;
            }
        }
    }
    //stabilire distanta fata de dragonu
    while(que_bot<=que_top)
    {
        if(1<que[que_bot][0]&&
           (drake_map[que[que_bot][0]-1][que[que_bot][1]]==-1||
            drake_map[que[que_bot][0]-1][que[que_bot][1]]>drake_map[que[que_bot][0]][que[que_bot][1]]+1))
        {
            ++que_top;
            que[que_top][0]=que[que_bot][0]-1;
            que[que_top][1]=que[que_bot][1];
            que[que_top][2]=que[que_bot][2]+1;
            drake_map[que[que_top][0]][que[que_top][1]]=que[que_top][2];
        }
        if(que[que_bot][0]<n&&
           (drake_map[que[que_bot][0]+1][que[que_bot][1]]==-1||
            drake_map[que[que_bot][0]+1][que[que_bot][1]]>drake_map[que[que_bot][0]][que[que_bot][1]]+1))
        {
            ++que_top;
            que[que_top][0]=que[que_bot][0]+1;
            que[que_top][1]=que[que_bot][1];
            que[que_top][2]=que[que_bot][2]+1;
            drake_map[que[que_top][0]][que[que_top][1]]=que[que_top][2];
        }
        if(1<que[que_bot][1]&&
           (drake_map[que[que_bot][0]][que[que_bot][1]-1]==-1||
            drake_map[que[que_bot][0]][que[que_bot][1]-1]>drake_map[que[que_bot][0]][que[que_bot][1]]+1))
        {
            ++que_top;
            que[que_top][0]=que[que_bot][0];
            que[que_top][1]=que[que_bot][1]-1;
            que[que_top][2]=que[que_bot][2]+1;
            drake_map[que[que_top][0]][que[que_top][1]]=que[que_top][2];
        }
        if(que[que_bot][1]<m&&
           (drake_map[que[que_bot][0]][que[que_bot][1]+1]==-1||
            drake_map[que[que_bot][0]][que[que_bot][1]+1]>drake_map[que[que_bot][0]][que[que_bot][1]]+1))
        {
            ++que_top;
            que[que_top][0]=que[que_bot][0];
            que[que_top][1]=que[que_bot][1]+1;
            que[que_top][2]=que[que_bot][2]+1;
            drake_map[que[que_top][0]][que[que_top][1]]=que[que_top][2];
        }
        ++que_bot;
    }
    que_bot=0;
    que_top=0;
    que[0][0]=in_x;
    que[0][1]=in_y;
    que[0][2]=drake_map[in_x][in_y];
    move_map[in_x][in_y]=drake_map[in_x][in_y];
    while(que_bot<=que_top)
    {
          if(1<que[que_bot][0]&&
           (move_map[que[que_bot][0]-1][que[que_bot][1]]==-1||
            (move_map[que[que_bot][0]-1][que[que_bot][1]]<move_map[que[que_bot][0]][que[que_bot][1]]&&
            drake_map[que[que_bot][0]-1][que[que_bot][1]]>move_map[que[que_bot][0]-1][que[que_bot][1]])))
        {
            ++que_top;
            que[que_top][0]=que[que_bot][0]-1;
            que[que_top][1]=que[que_bot][1];
            if(drake_map[que[que_bot][0]-1][que[que_bot][1]]<que[que_bot][2]) que[que_top][2]=drake_map[que[que_bot][0]-1][que[que_bot][1]];
            else que[que_top][2]=que[que_bot][2];
            move_map[que[que_top][0]][que[que_top][1]]=que[que_top][2];
        }
           if(que[que_bot][0]<n&&
           (move_map[que[que_bot][0]+1][que[que_bot][1]]==-1||
            (move_map[que[que_bot][0]+1][que[que_bot][1]]<move_map[que[que_bot][0]][que[que_bot][1]]&&
            drake_map[que[que_bot][0]+1][que[que_bot][1]]>move_map[que[que_bot][0]+1][que[que_bot][1]])))
        {
            ++que_top;
            que[que_top][0]=que[que_bot][0]+1;
            que[que_top][1]=que[que_bot][1];
            if(drake_map[que[que_bot][0]+1][que[que_bot][1]]<que[que_bot][2]) que[que_top][2]=drake_map[que[que_bot][0]+1][que[que_bot][1]];
            else que[que_top][2]=que[que_bot][2];
            move_map[que[que_top][0]][que[que_top][1]]=que[que_top][2];
        }
            if(1<que[que_bot][1]&&
           (move_map[que[que_bot][0]][que[que_bot][1]-1]==-1||
            (move_map[que[que_bot][0]][que[que_bot][1]-1]<move_map[que[que_bot][0]][que[que_bot][1]]&&
            drake_map[que[que_bot][0]][que[que_bot][1]-1]>move_map[que[que_bot][0]][que[que_bot][1]-1])))
        {
            ++que_top;
            que[que_top][0]=que[que_bot][0];
            que[que_top][1]=que[que_bot][1]-1;
            if(drake_map[que[que_bot][0]][que[que_bot][1]-1]<que[que_bot][2]) que[que_top][2]=drake_map[que[que_bot][0]][que[que_bot][1]-1];
            else que[que_top][2]=que[que_bot][2];
            move_map[que[que_top][0]][que[que_top][1]]=que[que_top][2];
        }
            if(que[que_bot][1]<m&&
           (move_map[que[que_bot][0]][que[que_bot][1]+1]==-1||
            (move_map[que[que_bot][0]][que[que_bot][1]+1]<move_map[que[que_bot][0]][que[que_bot][1]]&&
            drake_map[que[que_bot][0]][que[que_bot][1]+1]>move_map[que[que_bot][0]][que[que_bot][1]+1])))
        {
            ++que_top;
            que[que_top][0]=que[que_bot][0];
            que[que_top][1]=que[que_bot][1]+1;
            if(drake_map[que[que_bot][0]][que[que_bot][1]+1]<que[que_bot][2]) que[que_top][2]=drake_map[que[que_bot][0]][que[que_bot][1]+1];
            else que[que_top][2]=que[que_bot][2];
            move_map[que[que_top][0]][que[que_top][1]]=que[que_top][2];
        }
        ++que_bot;
    }
    out<<move_map[out_x][out_y]<<'\n';
    in.close(); out.close();
    return 0;
}