LSFIGHT - Đấu trường VM08

Tác giả: flashmt

Ngôn ngữ: C++

#include<iostream>
#define maxn 510

int n;

int g(int x)
{
    if (x>n) return x-n;
    return x<1?x+n:x;
}

int main()
{
    int i,j,l,k,x,re,a[maxn][maxn],f[maxn][maxn],r[maxn];
    scanf("%d",&n);
    for (i=1;i<=n;i++)
      for (j=1;j<=n;j++)
      {
         scanf("%d",&a[i][j]);
         f[i][j]=0;
      }
    for (i=1;i<=n;i++) f[i][g(i+1)]=1;
    for (l=3;l<=n+1;l++)
      for (i=1;i<=n;i++)
      {
          j=i+l-1;
          x=g(j);
          for (k=i+1;k<j;k++)
            if (f[i][g(k)]&f[g(k)][x]&(a[i][g(k)]|a[x][g(k)])) 
            {
              f[i][x]=1; break;
            }
      }
    re=0;
    for (i=1;i<=n;i++)
      if (f[i][i])
      {
         re++;
         r[re]=i;
      }
    printf("%d\n",re);
    for (i=1;i<=re;i++)
       printf("%d\n",r[i]);
    return 0;
}

Download