Cod sursa(job #992050)

Utilizator AeroHHorea Stefan AeroH Data 1 septembrie 2013 00:19:15
Problema Zone Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <fstream>
#include <algorithm>
#include <cstdlib>
using namespace std;
ifstream f("zone.in");
ofstream g("zone.out");

long long int m[513][513],i,j,k,n,l1,c1,l2,c2,a,l,o,p,y;
long long int v[10],sum,vf[10];

int main()
{
    f>>n;
    for (i=1;i<=9;++i)f>>v[i];sort(v+1,v+10);
    for (i=1;i<=n;++i)
    for (j=1;j<=n;++j)
    f>>a,m[i][j]=m[i][j-1]+m[i-1][j]-m[i-1][j-1]+a;

    for (i=1;i<=n;++i)
        for (j=1;j<=n;++j,sum=0)
            {
                sum=m[i][j];

                for (k=1;k<=9;++k)
                    if (sum==v[k])break;

                if (k!=10)
                {   sum=0;
                    for (o=i+1;o<=n;++o)
                        for (p=j+1;p<=n;++p,sum=0)
                            {
                                sum=m[i][j]+m[o][p]-m[i][p]-m[o][j];

                                for (k=1;k<=9;++k)
                                    if (sum==v[k])break;

                                if (k!=10)
                                {
                                    sum=0;
                                    l1=i;l2=o;c1=j;c2=p;
                                   //g<<l1<<" "<<l2<<" "<<c1<<" "<<c2<<'\n';
                                   vf[1]+=m[l1][c1];
                                   vf[2]+=m[l2][c1]-m[l1][c1];
                                   vf[3]+=m[n][c1]-m[l2][c1];

                                   vf[4]+=m[l1][c2]-m[l1][c1];
                                   vf[5]+=m[l1][c1]+m[l2][c2]-m[l1][c2]-m[l2][c1];
                                   vf[6]+=m[l2][c1]+m[n][c2]-m[l2][c2]-m[n][c1];

                                   vf[7]+=m[l1][n]-m[l1][c2];
                                   vf[8]+=m[l2][n]+m[l1][c2]-m[l1][n]-m[l2][c2];
                                   vf[9]+=m[n][n]+m[l2][c2]-m[l2][n]-m[n][c2];

                                   /*for (y=1;y<10;++y)
                                   g<<vf[y]<<" ";
                                   g<<'\n';*/
                                   sort (vf+1,vf+10);
                                   for (y=1;y<10;++y)
                                        if (v[y]!=vf[y])
                                            break;

                                   if (y==10)
                                        {g<<l1<<" "<<l2<<" "<<c1<<" "<<c2<<'\n';g.close();exit(0);}
                                   for (y=1;y<10;++y)
                                        vf[y]=0;
                                }
                            }
                }
            }
    return 0;
}