Cod sursa(job #1076576)

Utilizator WyvernFMI Stanescu Leonard Wyvern Data 10 ianuarie 2014 13:15:14
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fi("barbar.in");
ofstream fo("barbar.out");
char ch;
int a[1002][1002],b[1002][1002],d[1002][1002],r,c,x1,y1,x2,y2;

void drum(int i,int j,int mn) {
    if (a[i][j]<mn)
        mn=a[i][j];
    d[i][j]=mn;
    if (((a[i+1][j]>0)&&(d[i+1][j]==0))||((a[i+1][j]>d[i+1][j])&&(mn>d[i+1][j])&&(d[i+1][j]>0)))
        drum(i+1,j,mn);
    if (((a[i][j+1]>0)&&(d[i][j+1]==0))||((a[i][j+1]>d[i][j+1])&&(mn>d[i][j+1])&&(d[i][j+1]>0)))
        drum(i,j+1,mn);
    if (((a[i-1][j]>0)&&(d[i-1][j]==0))||((a[i-1][j]>d[i-1][j])&&(mn>d[i-1][j])&&(d[i-1][j]>0)))
        drum(i-1,j,mn);
    if (((a[i][j-1]>0)&&(d[i][j-1]==0))||((a[i][j-1]>d[i][j-1])&&(mn>d[i][j-1])&&(d[i][j-1]>0)))
        drum(i,j-1,mn);
}

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);
}

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=0;i<=r+1;i++)
        for (int j=0;j<=c+1;j++)
            if (b[i][j]==1)
                d[i][j]=-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);
    drum(x1,y1,2000);
    fo<<d[x2][y2];
    return 0;
}