#include <iostream.h>

int used[64];
int grid[5][5];

void init(void) {
 int i,j;
 for (i=0;i<64;i++) used[i] =0;
}

void fgrid(int row,int num) {
 int cord=4;
 while (num>0) {
   grid[row][cord] = num%10;
   num /= 10;
   cord--;
 }
}


void check(int i,int j,int sofar) {
  if (i+j==8) {
    used[sofar]=1;
  } else {
    if (i<4) check(i+1,j,sofar+grid[i][j]);
    if (j<4) check(i,j+1,sofar+grid[i][j]);
  }
}

int sum(void) {
  int max=0;int count=0;
  for (int i=0;i<=64;i++) if (used[i]==1) {count++;max=(count<max?max:count);}
     else count=0;
  return max;
}

void print(int max) {
  int i,j;
  for (i=0;i<5;i++) { for (j=0;j<5;j++) cout << grid[i][j] << " ";
    cout << "\n";
  }
  for (i=0;i<=64;i++) if (used[i]==1) {
      if (((i==0)||(used[i-1]==0))&&(i!=64)&&(used[i+1]!=0)) cout << i << "-";
    } else if ((i!=0)&&(used[i-1]==1)) cout << i-1 << ",";
  cout << "Longest sequence: " << max << "\n";
}

void cycle(void) {
 int a,b,c,d,e,mymax=0,temp;
 for (a=0;a<1000;a++) { fgrid(0,a);
 for (b=10000;b<100000;b++) { fgrid(1,b);
 for (c=0;c<100000;c++) { fgrid(2,c);
 for (d=0;d<100000;d++) { fgrid(3,d);
 for (e=0;e<100000;e+=10) { fgrid(4,e);
   if ((grid[4][3]==0) || (grid[3][4]==0)) {
   init();
   check(0,0,0);
   temp = sum();
   if (temp >= mymax) {
     print(temp);
     mymax = temp;
   }
   }
 }}}}}  
}

void main(void) {
  cycle();
}

