Cod sursa(job #2552816)

Utilizator mihnea03Ciocioiu Mihnea mihnea03 Data 21 februarie 2020 11:20:15
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <fstream>
#define dim 1010
using namespace std;
int a[dim][dim];
int f[dim][dim];
int dr[dim][dim];
int d[dim][dim];
pair <int,int> c[dim];
pair <int,int> D[dim];
int i,j,k,n,m;
char ch;

int di[]={-1,0,1, 0};
int dj[]={ 0,1,0,-1};

void stergere(int a[dim][dim]) {
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++) a[i][j]=0;
}

int isOK(int i,int j) {
    if (i<1||i>n||j<1||j>m) return 0;
    return 1;
}

void LeeDragon(int i,int j) {
    f[i][j]=1;
    dr[i][j]=1;
    int u=0,p=1;
    c[++u]=make_pair(i,j);
    while (p<=u) {
        int ic=c[p].first;
        int jc=c[p].second;
        for (int dir=0;dir<4;dir++) {
            int iu=ic+di[dir];
            int ju=jc+dj[dir];
            if (isOK(iu,ju)&&f[iu][ju]==0&&a[iu][ju]!=2) {
                f[iu][ju]=1;
                c[++u]=make_pair(iu,ju);
                dr[iu][ju]=dr[ic][jc]+1;
                d[iu][ju]=min(d[iu][ju],dr[iu][ju]);
            }
        }
        p++;
    }
}

int main() {
    ifstream fin("barbar.in");
    ofstream fout("barbar.out");
    fin>>n>>m;
    ///Dragon=3
    ///Perete=2
    ///Barbar=1
    ///Final=4
    for (i=1;i<=n;i++) {
        for (j=1;j<=m;j++) {
            fin>>ch;
            if (ch=='D') {
                a[i][j]=3;
                D[++k]=make_pair(i,j);
            }
            if (ch=='*') a[i][j]=2;
            if (ch=='I') a[i][j]=1;
            if (ch=='O') a[i][j]=4;
        }
    }
    for (i=1;i<=k;i++) {
        LeeDragon(D[i].first,D[i].second);
        stergere(f);
        stergere(dr);
    }
    for (i=1;i<=n;i++) {
        for (j=1;j<=n;j++) {
            fout<<d[i][j]<<" ";
        }
        fout<<"\n";
    }
    return 0;
}