水题一道,却切得很吃力。
题意:n*m的图上有许多小格,小格上是数字0或者1,问每对一个小格上的数字进行反转一次,在所有行中最大的连续的1的个数。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct A
{
int maxx,sum;
}a[505];
int main()
{
int n,m,q;
int s[505][505],maxn,x,y;
while(scanf("%d%d%d",&n,&m,&q)!=EOF)
{
maxn=-1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&s[i][j]);
for(int i=1;i<=n;i++)
{
a[i].maxx=-1;
a[i].sum=0;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(s[i][j]==1)
{
a[i].sum++;
}
else
{
a[i].maxx=max(a[i].maxx,a[i].sum);
a[i].sum=0;
}
a[i].maxx=max(a[i].maxx,a[i].sum);
}
maxn=max(maxn,a[i].maxx);
}
while(q--)
{
scanf("%d%d",&x,&y);
if(s[x][y]==1)
{
s[x][y]=0;
}
else
{
s[x][y]=1;
}
a[x].sum=0;
a[x].maxx=-1; //!!!
for(int j=1;j<=m;j++)
{
if(s[x][j]==1)
{
a[x].sum++;
}
else
{
a[x].sum=0;
a[x].maxx=max(a[x].maxx,a[x].sum);
}
a[x].maxx=max(a[x].maxx,a[x].sum);
}
int ans=-1;
for(int i = 1; i<=n; i++) //!!!
ans=max(ans,a[i].maxx);
printf("%d\n",ans);
}
}
return 0;
}