Cod sursa(job #1298870)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 23 decembrie 2014 11:55:26
Problema PScPld Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <cstdio>

using namespace std;
char c[1002][1002];
int N,nrp;

void Read(){
    scanf("%d\n",&N);
    for(int i = 1; i <= N; ++i)
    {
        fgets(c[i]+1,1002,stdin);
        c[i][0] = '#';
    }
}

int check(int x,int y,int k)
{
    for(int i = 0; i < k; ++i)
        for(int j = 0; j < k; ++j)
        {
            if(c[x-k + i][y-k + j] != c[x+k -i][y-k +j])/// orizontala sus
                    return 0;
            if(c[x-k + i][y+k - j] != c[x-k +i][y+k -j])/// orizontala jos
                    return 0;
            if(c[x-k + i][y-k + j] != c[x-k +i][y+k -j]) /// verticala stanga
                    return 0;
            if(c[x+k - i][y-k + j] != c[x+k -i][y+k -j]) /// verticala dreapta
                    return 0;
        }
    return 1;
}

void square(int x,int y) /// c[x][y] e centrul
{
    for(int k = 1; k <= N/2; ++k)
    {
        if(x + k > N || x - k < 1 || y + k > N || y - k < 1)
            return; /// imposibil
        if(c[x+k][y] == c[x-k][y] && c[x][y+k] == c[x][y-k]) /// e bine in cruce
            if(c[x+k][y+k] == c[x-k][y+k] && c[x+k][y-k] == c[x-k][y-k]) /// e bine si pe diagonale
                if(check(x,y,k))
                    ++nrp;
    }
}

void Solve(){
    for(int i = 1; i <= N; ++i)
        for(int j = 1; j <= N; ++j)
            square(i,j);
    nrp += N*N;
    printf("%d\n",nrp);
}

int main()
{
    freopen("pscpld2d.in","r",stdin);
    freopen("pscpld2d.out","w",stdout);

    Read();
    Solve();

    return 0;
}