Cod sursa(job #1453381)

Utilizator savinvadim1312savin vadim savinvadim1312 Data 23 iunie 2015 13:40:49
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.83 kb
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

ifstream f("barbar.in");
ofstream g("barbar.out");

struct poz{
    int c,r;
};

struct poz dragon[1000020],pornire,oprire;
long int t[1005][1005],v[1000020][5],x,y;
long int R,C,nr_drag,i,j,pasi,gasit;
char ch;

long int cauta(int r,int c){
int d;
    d=fabs(r-dragon[0].r)+fabs(c-dragon[0].c);

    for(int i=1;i<nr_drag;i++)
    {
        if(fabs(r-dragon[i].r)+fabs(c-dragon[i].c)<d)
            d=fabs(r-dragon[i].r)+fabs(c-dragon[i].c);
    }
    return d;
}

int main()
{
    f>>R>>C;
    for(int i=0;i<R;i++){
        for(int j=0;j<C;j++){
          f>>ch;
          if(ch=='.')
            t[i][j]=0;
          else if (ch=='*')
            t[i][j]=-1;
          else if(ch=='D'){
            t[i][j]=-2;
            dragon[nr_drag].c=j;
            dragon[nr_drag].r=i;
            nr_drag++;
          }
          else if(ch=='I'){
            pornire.c=j;
            pornire.r=i;
            t[i][j]=-3;
          }
          else if(ch=='O')
            t[i][j]=-4;
            oprire.r=i;
            oprire.c=j;
        }
    }

    for(int i=0;i<R;i++){
        for(int j=0;j<C;j++){
            t[-1][j]=-1;
            t[R][j]=-1;
            t[i][-1]=-1;
            t[i][C]=-1;
        }
    }

    i=pornire.r;
    j=pornire.c;
    pasi=0;
    t[i][j]=cauta(i,j);
    x=0;y=0;

    while(!gasit){
        if(i==oprire.r && j==oprire.c){
            gasit=1;
        }else{

            if(t[i+1][j]>0){
                t[i+1][j]=max(t[i][j],t[i+1][j]);
            }
            else if(t[i+1][j]==0 || t[i+1][j]==-4 ){
                t[i+1][j]=min(t[i][j],cauta(i+1,j));
                v[y][0]=i+1;
                v[y][1]=j;
                y++;
            }

            if(t[i-1][j]>0){
                t[i-1][j]=max(t[i][j],t[i-1][j]);
            }
            else if(t[i-1][j]==0 || t[i-1][j]==-4){
                t[i-1][j]=min(t[i][j],cauta(i-1,j));
                v[y][0]=i-1;
                v[y][1]=j;
                y++;
            }

            if(t[i][j+1]>0){
                t[i][j+1]=max(t[i][j],t[i][j+1]);
            }
            else if(t[i][j+1]==0 || t[i][j+1]==-4){
                t[i][j+1]=min(t[i][j],cauta(i,j+1));
                v[y][0]=i;
                v[y][1]=j+1;
                y++;
            }

            if(t[i][j-1]>0){
                t[i][j-1]=max(t[i][j],t[i][j-1]);
            }
            else if(t[i][j-1]==0 || t[i][j-1]==-4){
                t[i][j-1]=min(t[i][j],cauta(i,j-1));
                v[y][0]=i;
                v[y][1]=j-1;
                y++;
            }
            i=v[x][0];
            j=v[x][1];
            x++;
        }
    }
    g<<t[oprire.r][oprire.c];






    return 0;
}