#include<iostream>
#include<algorithm>

using namespace std;


struct S{
  int box[22][2][2];
};

void show(struct S s){
  for(int i=21;i>=0;i--){
    cout << i << ":";
    for(int j=0;j<2;j++){
      for(int k=0;k<2;k++){
        cout << s.box[i][k][j];
        cout << " ";
      }
      cout << "  " ;
    }
    cout << endl;
  }
  cout << endl;
}

int simulation(struct S s,int N,int count,int num,int block[3][2][2][2]){
  if(N==num){
    return count;
  }
  int ans=count;
  for(int i=-1;i<=1;i++){
    for(int j=-1;j<=1;j++){
      bool ok=true;
      for(int k=0;k<2;k++){
        for(int l=0;l<2;l++){
          for(int m=0;m<2;m++){
            if(block[N][k][l][m]==1){
              if(l+i<0||l+i>=2||m+j<0||m+j>=2){
                ok=false;
              }
            }
          }
        }
      }
      if(!ok){
        continue;
      }
      struct S s2;
      for(int k=0;k<22;k++){
        for(int l=0;l<2;l++){
          for(int m=0;m<2;m++){
            s2.box[k][l][m]=s.box[k][l][m];
          }
        }
      }
      int drop=0;
      int H;
      for(int k=0;k<22;k++){
        int check=0;
        for(int l=0;l<2;l++){
          for(int m=0;m<2;m++){
            check+=s2.box[k][l][m];
          }
        }
        if(check==0){
          H=k;
          break;
        }
      }
      ok=true;
      bool ok2=true;
      for(int m=0;;m++){
        for(int k=0;k<2;k++){
          for(int l=0;l<2;l++){
            if(k+i<0||k+i>=2||l+j<0||l+j>=2)continue;
            if(block[N][0][k][l]==1&&H-m<0)ok=false;
            if(block[N][1][k][l]==1&&H+1-m<0)ok=false;
            if(s2.box[H-m][k+i][l+j]+block[N][0][k][l]==2&&H-m>=0)ok=false;
            if(s2.box[H+1-m][k+i][l+j]+block[N][1][k][l]==2&&H+1-m>=0)ok=false;
          }
        }
        if(!ok){
          H=H-m+1;
          break;
        }
      }
      for(int k=0;k<2;k++){
        for(int l=0;l<2;l++){
          if(l+i<0||l+i>=2)continue;
          for(int m=0;m<2;m++){
            if(m+j<0||m+j>=2)continue;
            s2.box[H+k][l+i][m+j]+=block[N][k][l][m];
          }
        }
      }
      for(int k=0;k<22;k++){
        int check=0;
        for(int l=0;l<2;l++){
          for(int m=0;m<2;m++){
            check+=s2.box[k][l][m];
          }
        }
        if(check==4){
          drop++;
          for(int l=0;l<2;l++){
            for(int m=0;m<2;m++){
              s2.box[k][l][m]=0;
            }
          }
          for(int l=k;l<21;l++){
            for(int m=0;m<2;m++){
              for(int n=0;n<2;n++){
                s2.box[l][m][n]=s2.box[l+1][m][n];
                s2.box[l+1][m][n]=0;
              }
            }
          }
          k=-1;
        }
      }
      ans=max(ans,simulation(s2,N+1,count+drop,num,block));
    }
  }
  return ans;
}

int main(){
  while(1){
    struct S s;
    int block[3][2][2][2]={0};
    for(int i=0;i<22;i++){
      for(int j=0;j<2;j++){
        for(int k=0;k<2;k++){
          s.box[i][j][k]=0;
        }      
      }
    }
    for(int i=0;i<3;i++){
      for(int j=0;j<2;j++){
        for(int k=0;k<2;k++){
          for(int l=0;l<2;l++){
            block[i][j][k][l]=0;
          }
        }
      }
    }
    int H,N;
    cin >> H >> N;
    if(H==0&&N==0)break;
    for(int i=0;i<H;i++){
      for(int j=0;j<2;j++){
        for(int k=0;k<2;k++){
          char a;
          cin >> a;
          if(a=='#'){
            s.box[i][j][k]=1;
          }
        }
      }
    }
    for(int i=0;i<N;i++){
      for(int j=0;j<2;j++){
        for(int k=0;k<2;k++){
          for(int l=0;l<2;l++){
            char a;
            cin >> a;
            if(a=='#'){
              block[i][j][k][l]=1;
            }
          }
        }
      }
    }
    cout << simulation(s,0,0,N,block) << endl;
  }
}
//          int F=0;
//          int sum=0;
//          for(int l=0;l<2;l++){
//            for(int m=0;m<2;m++){
//              sum+=s2.box[k+1][l][m];
//            }
//          }
//          if(sum!=0){
//            for(int l=1;;l++){
//              if(k-l<0){
//                F=F-l+1;
//                break;
//              }
//              bool che=true;
//              for(int o=0;o<l;o++){
//                for(int m=0;m<2;m++){
//                  for(int n=0;n<2;n++){
//                    if(k+1+o>=22)continue;
//                    if(s2.box[k-l+o][m][n]+s2.box[k+1+o][m][n]==2)che=false;
//                  }
//                }
//              }
//              if(!che){
//                F=F-l+1;
//                break;
//              }
//            }
//            for(int l=k;l<21;l++){
//              for(int m=0;m<2;m++){
//                for(int n=0;n<2;n++){
//                  s2.box[l+F][m][n]+=s2.box[l+1][m][n];
//                  s2.box[l+1][m][n]=0;
//                }
//              }
//            }



Measured memory_bytes: 3092