#include <bits/stdc++.h>

using namespace std;

using ll = long long;

#define FOR(i,n,m) for(ll i=(n);i<(m);++i)
#define REP(i,n) FOR(i,0,n)

using Field=vector<vector<string>>;


pair<Field,int> move(const Field b,int dh,int dw){
  Field res(2,vector<string>(2,".."));
  for(int i=0;i<2;i++){
    for(int j=0;j<2;j++){
      for(int k=0;k<2;k++){
	if(0<=j+dh && j+dh<2 && 0<=k+dw && k+dw<2){
	  res[i][j+dh][k+dw]=b[i][j][k];
	}
	else{
	  if(b[i][j][k]=='#'){
	    return make_pair(res,-1);
	  }
	}
      }
    }
  }
  return {res,0};
}

Field drop(Field f,Field nb){
  int soko=-1;

  for(int x=18;x>=-1;x--){
    if(x==-1){
      soko=0;
      break;
    }
    for(int i=0;i<2;i++){
      for(int j=0;j<2;j++){
	for(int k=0;k<2;k++){
	  if(f[i+x][j][k]=='#' && nb[i][j][k]=='#'){
	    soko=x+1;
	  }
	}
      }
    }
    if(soko!=-1){
      break;
    }
  }

  Field res=f;
  for(int i=0;i<2;i++){
    for(int j=0;j<2;j++){
      for(int k=0;k<2;k++){
	if(nb[i][j][k]=='#'){
	  res[i+soko][j][k]='#';
	}
      }
    }
  }
  return res; 
}

int fresh(Field &nf){
  int res=0;
  for(int i=0;i<20;i++){
    bool isFresh=true;
    for(int j=0;j<2;j++){
      for(int k=0;k<2;k++){
	isFresh&=(nf[i][j][k]=='#');
      }
    }
    if(isFresh){
      res++;
      for(int j=0;j<2;j++){
	for(int k=0;k<2;k++){
	  nf[i][j][k]='.';
	}
      }
      for(int ii=i+1;ii<20;ii++){
	for(int j=0;j<2;j++){
	  for(int k=0;k<2;k++){
	    nf[ii-1][j][k]=nf[ii][j][k];
	  }
	}
      }
      i--;
    }
  }
  return res;
}

int dfs(int index,Field &f,const vector<Field> &blocks,const int n){
  if(index==n) return 0;
  int res=0;
  for(int dh=-1;dh<=1;dh++){
    for(int dw=-1;dw<=1;dw++){
	auto nbp=move(blocks[index],dh,dw);
	if(nbp.second==-1){
	  continue;
	}
	Field nb=nbp.first;
	Field nf=drop(f,nb);
	int sc=fresh(nf);
	res=max(sc+dfs(index+1,nf,blocks,n),res);	
    }
  }
  return res;
}
int solve(int h,int n){
  Field f(20,vector<string>(2,".."));
  for(int i=0;i<h;i++){
    cin>>f[i][0];
    cin>>f[i][1];
  }

  vector<Field> b(n,Field(2,vector<string>(2,"..")));
  for(int i=0;i<n;i++){
    cin>>b[i][0][0];
    cin>>b[i][0][1];
    cin>>b[i][1][0];
    cin>>b[i][1][1];
    if(b[i][0][0][0]=='.' && b[i][0][0][1]=='.' && b[i][0][1][0]=='.' && b[i][0][1][1]=='.'){
      b[i][0][0][0]=b[i][1][0][0];
      b[i][0][0][1]=b[i][1][0][1];
      b[i][0][1][0]=b[i][1][1][0];
      b[i][0][1][1]=b[i][1][1][1];
      b[i][1][0][0]='.';
      b[i][1][0][1]='.';
      b[i][1][1][0]='.';
      b[i][1][1][1]='.';
    }
  }

    return dfs(0,f,b,n);
}
int main() {

  while(true){
    int h,n;
    cin>>h>>n;
    if(h==0) break;
    // cout<<h<<" "<<n<<endl;
    cout<<solve(h,n)<<endl;
  }
  return 0;
}
