Cod sursa(job #205980)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 3 septembrie 2008 20:15:29
Problema Struti Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include<stdio.h>

FILE *fin=fopen("struti.in","r"),
    *fout=fopen("struti.out","w");

int N,M,P,a[1005][1005];
int nr,sol;

void rezolvare(int i,int j){
    for(int k=1;k<=N-i+1;k++)
        for(int l=1;l<=M-j+1;l++){
            int min=8009,max=-1;
            for(int kk=k;kk<=k+i-1;kk++)
                for(int ll=l;ll<=l+j-1;ll++){
                        if(a[kk][ll]>max) max=a[kk][ll];
                        if(a[kk][ll]<min) min=a[kk][ll];
                }
            if(max-min==sol) ++nr;
            else
                if(max-min<sol){
                    sol=max-min;
                    nr=1;
                }
        }

}

int main(){
    fscanf(fin,"%d%d%d",&N,&M,&P);

    for(int i=1;i<=N;i++)
        for(int j=1;j<=M;j++)
            fscanf(fin,"%d",&a[i][j]);

    for(int k=1;k<=P;k++){
        int i,j;
        fscanf(fin,"%d %d",&i,&j);
        nr=0;sol=8008;

        for(int k=1;k<=N-i+1;k++)
            for(int l=1;l<=M-j+1;l++){
                int min=8009,max=-1;
                for(int kk=k;kk<=k+i-1;kk++)
                    for(int ll=l;ll<=l+j-1;ll++){
                            if(a[kk][ll]>max) max=a[kk][ll];
                            if(a[kk][ll]<min) min=a[kk][ll];
                    }
                if(max-min==sol) ++nr;
                else
                    if(max-min<sol){
                        sol=max-min;
                        nr=1;
                    }
            }
        if(i!=j)
            for(int k=1;k<=N-j+1;k++)
                for(int l=1;l<=M-i+1;l++){
                    int min=8009,max=-1;
                    for(int kk=k;kk<=k+j-1;kk++)
                        for(int ll=l;ll<=l+i-1;ll++){
                                if(a[kk][ll]>max) max=a[kk][ll];
                                if(a[kk][ll]<min) min=a[kk][ll];
                        }
                    if(max-min==sol) ++nr;
                    else
                        if(max-min<sol){
                            sol=max-min;
                            nr=1;
                        }
                    }

        fprintf(fout,"%d %d\n",sol,nr);
    }

    fclose(fin);
    fclose(fout);
    return 0;

}