C11CUT - Cắt bảng

Tác giả: skyvn97

Ngôn ngữ: C++

#include<stdio.h>
#define MAX   17
int a[MAX][MAX];
int x[MAX][MAX];
long best;
int m,n;
void update(void)
{
     int i,j,k;
     long sum,val;
     bool saw[MAX][MAX];
     for (i=1;i<=m;i=i+1)
         for (j=1;j<=n;j=j+1)
             saw[i][j]=false;
     sum=0;
     for (i=1;i<=m;i=i+1)
         for (j=1;j<=n;j=j+1)         
             {
              if (saw[i][j]) continue;
              val=a[i][j];
              if (x[i][j]==1)
                 {
                  for (k=j+1;k<=n;k=k+1)
                      {
                       if (x[i][k]!=1) break;
                       else
                           {
                            val=val*10+a[i][k];
                            saw[i][k]=true;
                           }
                      }                  
                 }
              if (x[i][j]==2)
                 {
                  for (k=i+1;k<=m;k=k+1)
                      {
                       if (x[k][j]!=2) break;
                       else
                           {
                            val=val*10+a[k][j];
                            saw[k][j]=true;
                           }
                      }
                 }
              sum=sum+val;
              saw[i][j]=true;
             }
     if (sum>best) best=sum;        
        
}
void btrk(int r,int c)
{
     int i;
     for (i=1;i<=2;i=i+1)
         {
          x[r][c]=i;
          if (c==n)
             {
              if (r==m) update();
              else btrk(r+1,1);
             }
          else btrk(r,c+1);              
         }
}
void init(void)
{
     int i,j;
     scanf("%d",&m);
     scanf("%d",&n);
     for (i=1;i<=m;i=i+1)
         for (j=1;j<=n;j=j+1) scanf("%d",&a[i][j]);
     best=0;
}
int main(void)
{
    init();
    btrk(1,1);
    printf("%ld",best); 
}

Download