Cod sursa(job #1829990)

Utilizator maria15Maria Dinca maria15 Data 15 decembrie 2016 22:26:16
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>

#define f first
#define s second

using namespace std;

int n, i, j, t, sol[1001], v[1001][1001], d[1001][1001][1001];
pair <int, int> c[1000005];

ifstream fin("custi.in");
ofstream fout("custi.out");

int main(){
    fin>>n;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++){
            fin>>v[i][j];
            if(v[i][j]){
                sol[1]++;
                c[sol[1]].f=i;
                c[sol[1]].s=j;
                d[i][j][1]=1;
            }
        }
    fout<<sol[1]<<"\n";
    m=sol[1];
    //                                              0, daca submatricea k*k care incepe din (i;j) nu e plina de 1
    //                             d[i][j][k]=
    //                                              1, daca submatricea k*k care incepe din (i;j) e plina de 1

    //in acest scop verificam daca marginile imediat exterioare ale submatricei (k-1)*(k-1) contin numai 1
    //
    for(t=1;t<=m;t++){
        for(a=2;a<=n;a++){
            char ok=1;
            if(d[c[t].f][c[t].s][a-1]==0)
                d[c[t].f][c[t].s][a]=0;
            else{
                for(i=c[t].f;i<=c[t].f+a;i++)
                    if(v[i][c[t].s]==0){
                        d[c[t].f][c[t].s][a]=0;
                        ok=0;
                    }
                if(ok)
                    for(j=c[t].s;j<=c[t].s+a;j++)
                        if(v[c[t].f][j]==0)
                            d[c[t].f][c[t].s][a]=0;
            }
            sol[a]+=d[c[t].f][c[t].s][a];
        }
    }

    return 0;
}