#include<bits/stdc++.h>
using namespace std;
#define int long long
#define lp(i,n) for(int i=0;i<(n);i++)
#define lps(i,j,n) for(int i=j;i<n;i++)
#define fordebug int hoge;cin>>hoge;
#define DEKAI 1000000007
#define double long double
#define floot10 cout<<fixed<<setprecision(15)
#define Int long long
#define hogea pair<pair<int,int>,int>
#define all(v) v.begin(),v.end()
#define MAX_NODE 10000000
#define double long double
double PI = acos(-1);

struct bls{
  char block[2][2][20];
  bls(){
    lp(i,2){
      lp(j,2){
        lp(k,20){
          block[i][j][k]='.';
        }
      }
    }
  }
};
struct bl{
  char block[2][2][2];
  bl(){
    lp(i,2){
      lp(j,2){
        lp(k,2){
          block[i][j][k]='.';
        }
      }
    }
  }
};

int h,n;
bl bd[3];

bool putc(bls bs,bl b,int h){
  lp(i,2){
    lp(j,2){
      lp(k,2){
        if(bs.block[j][k][i+h]=='#'&&b.block[j][k][i]=='#')return false;
      }
    }
  }
  return true;
}

bls put(bls bs,bl b,int h){
  lp(i,2){
    lp(j,2){
      lp(k,2){
        if(b.block[j][k][i]=='#'){
          bs.block[j][k][i+h]='#';
        }
      }
    }
  }
  return bs;
}

void stamp(bls &bs){
  int flag=0;
  for(int i=19;i>=0;i--){
    int ch=0;
    lp(j,2){
      lp(k,2){
        if(bs.block[j][k][i]=='#'){
          flag=1;
          ch=1;
        }
      }
    }
    if(ch==0&&flag==1){
      for(int x=i;x<19;x++){
        lp(j,2){
          lp(k,2){
            bs.block[j][k][x]=bs.block[j][k][x+1];
          }
        }
      }
    }
  }
}

int remc(bls &bs){
  int ans=0;
  lp(i,20){
    int flg=0;
    lp(j,2){
      lp(k,2){
        if(bs.block[j][k][i]=='.')flg=1;
      }
    }
    if(flg==0){
      ans++;
      lp(j,2){
        lp(k,2){
          bs.block[j][k][i]='.';
        }
      }
    }
  }
  stamp(bs);
  return ans;
}

int cntbl(bl b){
  int cnt=0;
  lp(i,2){
    lp(j,2){
      lp(k,2){
        if(b.block[i][j][k]=='#')cnt++;
      }
    }
  }
  return cnt;
}

vector<bl> makebl(bl b){
  vector<bl> v;
  char base[4][4][2];
  lp(i,4){
    lp(j,4){
      lp(k,2){
        base[i][j][k]='.';
      }
    }
  }
  lp(i,2){
    lp(j,2){
      lp(k,2){
        base[j+1][k+1][i]=b.block[j][k][i];
      }
    }
  }
  int chf=0;
  lp(i,2){
    lp(j,2){
      if(base[i+1][j+1][0]=='#')chf=1;
    }
  }
  if(chf==0){
    lp(i,2){
      lp(j,2){
        base[i+1][j+1][0]=base[i+1][j+1][1];
        base[i+1][j+1][1]='.';
      }
    }
  }
  int basecnt=cntbl(b);
  lp(bj,3){
    lp(bk,3){
      bl bx;
      lp(i,2){
        lp(j,2){
          lp(k,2){
            bx.block[j][k][i]=base[j+bj][k+bk][i];
          }
        }
      }
      if(cntbl(bx)==basecnt){
        v.push_back(bx);
      }
    }
  }
  return v;
}

void writebls(bls bs){
  lp(i,10){
    lp(j,2){
      lp(k,2){
        cout<<bs.block[j][k][i];
      }
      cout<<endl;
    }
    cout<<endl;
  }
}
void writebl(bl bs){
  lp(i,2){
    lp(j,2){
      lp(k,2){
        cout<<bs.block[j][k][i];
      }
      cout<<endl;
    }
    cout<<endl;
  }
}
int solve(bls bs,int num){
  if(num==n)return 0;
  vector<bl> v=makebl(bd[num]);
  //cout<<num<<" "<<v.size()<<endl;
  //writebls(bs);
  int ans=0;
  lp(i,v.size()){
    bl b=v[i];
    //cout<<"####B"<<endl;
    //writebl(b);
    for(int hx=18;hx>=0;hx--){
      if(!putc(bs,b,hx)||hx==0){
        if(!putc(bs,b,hx))hx++;
        bls res=put(bs,b,hx);
        //cout<<"####BLS  "<<hx<<endl;
        //writebls(res);
        int a=remc(res);
        //cout<<a<<endl;
        ans=max(ans,a+solve(res,num+1));
        break;
      }
    }
  }
  //cout<<"   "<<num<<" "<<ans<<endl;
  return ans;
}

signed main(){
  while(1){
    cin>>h>>n;
    if(h==0&&n==0)break;
    bls bs;
    lp(i,h){
      lp(j,2){
        lp(k,2){
          cin>>bs.block[j][k][i];
        }
      }
    }
    lp(i,n){
      lp(j,2){
        lp(k,2){
          lp(l,2){
            cin>>bd[i].block[k][l][j];
          }
        }
      }
    }

    cout<<solve(bs,0)<<endl;
  }
  return 0;
}



Measured memory_bytes: 3116