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();
}

Download