Pagini recente » Cod sursa (job #3256865) | Cod sursa (job #882468) | Cod sursa (job #2780663) | Cod sursa (job #1282881) | Cod sursa (job #390453)
Cod sursa(job #390453)
#include<stdio.h>
#include<string.h>
#define VMAX 300
int m,n,X,maxim,apel=1;
unsigned char a[VMAX][VMAX],mat[VMAX][VMAX],lin[VMAX][VMAX];
char buf[810];
void read()
{
FILE*f=fopen("teren.in","r");
fscanf(f,"%d %d %d",&n,&m,&X);
int i,j,var;
fgets(buf,10,f);
int siz,ct;
for(i=0;i<n;++i)
{
fgets(buf,810,f);
siz=strlen(buf);
for(j=0,ct=0;j<siz;j+=2,++ct)
{
a[i][ct]=0;
if(i>0)a[i][ct]+=a[i-1][ct];
a[i][ct]+=buf[j]-48;
lin[i][ct]=a[i][ct];
if(ct>0)lin[i][ct]+=lin[i][ct-1];
// lin[i][ct]+=buf[j]-48;
}
}
fclose(f);
}
int suma(int x1,int y1,int x2,int y2)
{
int i=0,s=0;
s=lin[x2][y2];
if(x1>0){s-=lin[x1-1][y2];i=1;}
if(y1>0&&!i)s-=lin[x2][y1-1];
s=0;
for(i=y1;i<=y2;++i)
if(x1>0)s+=a[x2][i]-a[x1-1][i];
else s+=a[x2][i];
return s;
}
void search(int x,int y)
{
int i=x,j=y,var,s=0,jCreste=1;
while(i>=x)
{
var=(i-x+1)*(j-y+1);
s=suma(x,y,i,j);
if(mat[i][j]!=apel)mat[i][j]=apel;
else s=X+1;
if(s<=X&&j<m&&i<n)
{
if(var>maxim)maxim=var;
if(mat[i+1][j]!=apel)++i;
else ++j;
}
else
{
--i;
if((i-x+1)*(m-y)<=maxim)
i=-1;
if(mat[i][j]==apel)++j;
}
if(i==n)
{--i;++j;}
if(j>=m)
{--j;jCreste=-1;}
}
}
int solve()
{
int i,j;
maxim=0;
for(i=0;i<n;++i)
for(j=0;j<m;++j)
if((n-i)*(m-j)>maxim){search(i,j);++apel;}
return maxim;
}
int main()
{
read();
FILE*g=fopen("teren.out","w");
fprintf(g,"%d",solve());
fclose(g);
return 0;
}