BCHESS - Bàn cờ tướng
Tác giả: skyvn97
Ngôn ngữ: C++
#include<stdio.h>
#define MAX 2001
int a[MAX][MAX];
int f[MAX][MAX];
int n;
int m1,m2,m3;
int c1,c2,c3;
int min(int x,int y,int z)
{
int m;
m=x;
if (y<m) m=y;
if (z<m) m=z;
return (m);
}
void init(void)
{
char s[MAX];
int i,j;
scanf("%d",&n);
for (i=1;i<=n;i=i+1)
{
scanf("%s",&s);
for (j=1;j<=n;j=j+1)
a[i][j]=s[j-1]-48;
}
m1=1;m2=1;m3=1;
c1=0;c2=0;c3=0;
}
void optimize(void)
{
int i,j;
for (i=1;i<=n;i=i+1)
{
f[i][1]=1;
f[1][i]=1;
}
for (i=2;i<=n;i=i+1)
for (j=2;j<=n;j=j+1)
{
if ((a[i][j]==a[i-1][j-1]) && (a[i][j]!=a[i-1][j]) && (a[i][j]!=a[i][j-1]))
f[i][j]=min(f[i-1][j],f[i-1][j-1],f[i][j-1])+1;
else f[i][j]=1;
if ((a[i][j]==1) && (m2<f[i][j]-1+f[i][j]%2)) m2=f[i][j]-1+f[i][j]%2;
if ((a[i][j]==0) && (m3<f[i][j]-1+f[i][j]%2)) m3=f[i][j]-1+f[i][j]%2;
if (m1<f[i][j]-f[i][j]%2) m1=f[i][j]-f[i][j]%2;
}
for (i=1;i<=n;i=i+1)
for (j=1;j<=n;j=j+1)
{
if (f[i][j]>=m1) c1++;
if ((a[i][j]==1) && (f[i][j]>=m2)) c2++;
if ((a[i][j]==0) && (f[i][j]>=m3)) c3++;
}
printf("%d %d\n",m1,c1);
printf("%d %d\n",m2,c2);
printf("%d %d\n",m3,c3);
}
int main(void)
{
init();
optimize();
}