Cod sursa(job #1027830)

Utilizator WyvernFMI Stanescu Leonard Wyvern Data 13 noiembrie 2013 09:49:34
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fi("barbar.in");
ofstream fo("barbar.out");
char ch;
int a[1001][1001],b[1001][1001],r,c,x1,y1,x2,y2,mxx;

void dragoni(int i,int j,int x,int b[1001][1001]) {
    a[i][j]=x;
    b[i][j]=1;
    if ((a[i+1][j]>a[i][j]+1)||(b[i+1][j]==0))
        dragoni(i+1,j,x+1,b);
    if ((a[i][j+1]>a[i][j]+1)||(b[i][j+1]==0))
        dragoni(i,j+1,x+1,b);
    if ((a[i-1][j]>a[i][j]+1)||(b[i-1][j]==0))
        dragoni(i-1,j,x+1,b);
    if ((a[i][j-1]>a[i][j]+1)||(b[i][j-1]==0))
        dragoni(i,j-1,x+1,b);
}

void drum(int i,int j,int mx) {
    if (mx>a[i][j])
        mx=a[i][j];
    if ((b[i+1][j]==0)||((b[i+1][j]==1)&&(mx>a[i+1][j]))) {
        b[i+1][j]=1;
        drum(i+1,j,mx);
    }
    if ((b[i][j+1]==0)||((b[i][j+1]==1)&&(mx>a[i][j+1]))) {
        b[i][j+1]=1;
        drum(i,j+1,mx);
    }
    if ((b[i-1][j]==0)||((b[i-1][j]==1)&&(mx>a[i-1][j]))) {
        b[i-1][j]=1;
        drum(i-1,j,mx);
    }
    if ((b[i][j-1]==0)||((b[i][j-1]==1)&&(mx>a[i][j-1]))) {
        b[i][j-1]=1;
        drum(i,j-1,mx);
    }
    if ((i=x2)&&(j=y2))
        if (mxx<mx)
            mxx=mx;
}

int main()
{
    fi>>r>>c;
    for (int i=1;i<=r;i++)
        for (int j=1;j<=c;j++) {
            fi>>ch;
            if (ch=='.')
                a[i][j]=-2;
            else
                if (ch=='*') {
                    a[i][j]=-1;
                    b[i][j]=1;
                }
                else
                    if (ch=='D') {
                        a[i][j]=0;
                        b[i][j]=1;
                    }
                    else
                        if (ch=='I') {
                            x1=i;
                            y1=j;
                            a[i][j]=-3;
                        }
                        else {
                            x2=i;
                            y2=j;
                            a[i][j]=-4;
                        }
        }
    for (int i=1;i<=r;i++)
        b[i][0]=1;
    for (int i=1;i<=c;i++)
        b[0][i]=1;
    for (int i=1;i<=r;i++)
        b[i][c+1]=1;
    for (int i=1;i<=c;i++)
        b[r+1][i]=1;
    for (int i=1;i<=r;i++)
        for (int j=1;j<=c;j++)
            if (a[i][j]==0)
                dragoni(i,j,0,b);
    for (int i=1;i<=r;i++)
        for (int j=1;j<=c;j++)
            if ((a[i][j]!=0)&&(a[i][j]!=-1))
                b[i][j]=0;
    drum(x1,y1,2000);
    fo<<mxx;
    return 0;
}