Cod sursa(job #2365384)

Utilizator YetoAdrian Tonica Yeto Data 4 martie 2019 13:22:13
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.85 kb
#include <bits/stdc++.h>
using namespace std;
int n, m, i, j, nr, st, dr;
char a[101][101];int b[101][101];
bool C[101][101];
int dx[] = {0, -1, 1, 0, 0};
int dy[] = {0, 0, 0, 1, -1};
struct rebus {
    int l, c, v;
}q[20000];
ifstream fin ("rebus.in");
ofstream fout ("rebus.out");

void coada (int x, int y)
{
    int ln=0, cn=0;
    int st=1, dr=1;
    q[st].l=x;
    q[st].c=y;
    q[st].v=b[x][y];
    C[x][y]=1;
    while (st<=dr) {
        int l=q[st].l;
        int c=q[st].c;
        int v=q[st].v;
        if ((v&1)!=0) {
            cn=c-1;
            ln=l;
            if (ln>=1 && ln<=n && cn>=1 && cn<=n && b[ln][cn]>0 && C[ln][cn]==0) {
                q[++dr].l=ln;
                q[dr].c=cn;
                C[ln][cn]=1;
            }
            cn=c+1;
            ln=l;
            if (ln>=1 && ln<=n && cn>=1 && cn<=n && b[ln][cn]>0 && C[ln][cn]==0) {
                q[++dr].l=ln;
                q[dr].c=cn;
                C[ln][cn]=1;
            }
        }
        if ((v&2)!=0) {
            ln=l-1;
            cn=c;
            if (ln>=1 && ln<=n && cn>=1 && cn<=n && b[ln][cn]>0 && C[ln][cn]==0) {
                q[++dr].l=ln;
                q[dr].c=cn;
                C[ln][cn]=1;
            }
            ln=l+1;
            cn=c;
            if (ln>=1 && ln<=n && cn>=1 && cn<=n && b[ln][cn]>0 && C[ln][cn]==0) {
                q[++dr].l=ln;
                q[dr].c=cn;
                C[ln][cn]=1;
            }
        }
        st++;
    }
}

int verif (int l, int c, int dir)
{
    if (dir==1) {
        while (l>=1 && a[l][c]!='#') {
            l--;
            if (a[l][c]=='.') {
                return 0;
            }
        }
        return 1;
    }
    if (dir==3) {
        while (l<=n && a[l][c]!='#') {
            l++;
            if (a[l][c]=='.')
                return 0;
        }
        return 1;
    }
    if (dir==2) {
        while (c<=n && a[l][c]!='#') {
            c++;
            if (a[l][c]=='.')
                return 0;
        }
        return 1;
    }
    while (c>=1 && a[l][c]!='#') {
        c--;
        if (a[l][c]=='.')
            return 0;
    }
    return 1;
}
void repl(int l, int c, int dir)
{
    if (dir==1) {
        while (l>=1 && a[l-1][c]!='#') {
            l--;
            b[l][c]+=2;
        }
        return;
    }
    if (dir==3) {
        while (l<=n && a[l+1][c]!='#') {
            l++;
            b[l][c]+=2;
        }
        return;
    }
    if (dir==2) {
        while (c<=n && a[l][c+1]!='#') {
            c++;
            b[l][c]+=1;
        }
        return;
    }

    while (c>=1 && a[l][c-1]!='#') {
        c--;
        b[l][c]+=1;
    }
    return;
}

int main () {
    fin>>n>>m;
    for (i=1;i<=n;i++) {
        for (j=1;j<=m;j++) {
            fin>>a[i][j];
            if (a[i][j]=='#')
                b[i][j]=-1;
        }
    }

    for (i=1;i<=n;i++) {
        for (j=1;j<=m;j++) {
            if (a[i][j]=='#') {
                if (a[i-1][j]=='*')
                    if (verif(i-1, j, 1))
                        repl(i, j, 1);

                if (a[i+1][j]=='*')
                    if (verif(i+1, j, 3))
                        repl(i, j, 3);

                if (a[i][j+1]=='*')
                    if (verif(i, j+1, 2))
                        repl(i, j, 2);

                if (a[i][j-1]=='*')
                    if (verif(i, j-1, 4)==1)
                        repl(i, j, 4);
            }
        }
    }

    for (i=1;i<=n;i++) {
        for (j=1;j<=m;j++) {
            if (b[i][j]>0 && C[i][j]==0) {
                nr++;
                coada(i, j);
            }
        }
    }


    for (i=1;i<=n;i++) {
        for (j=1;j<=m;j++)
            fout<<C[i][j]<<" ";
        fout<<"\n";
    }
    fout<<nr;
    return 0;
}