http://acm.hdu.edu.cn/showproblem.php?pid=2640
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 const int N=110; 6 int n,m; 7 int mz[N]; 8 int d[N][260][260]; 9 void dfs(int p,int s0,int s1,int s2,int c,int r) 10 { 11 if(p>=m-1) 12 { 13 if(c>d[r][s1][s2]) d[r][s1][s2]=c; 14 return; 15 } 16 if(((s0>>p)&1)==0 && ((s1>>(p-1))&7)==0 && ((s2>>p)&1)==0) 17 dfs(p+1,s0|(1<<p),s1|(7<<(p-1)),s2|(1<<p),c+1,r); 18 dfs(p+1,s0,s1,s2,c,r); 19 } 20 int main() 21 { 22 int T; 23 scanf("%d",&T); 24 while(T--) 25 { 26 scanf("%d%d",&n,&m); 27 if(n==1) {printf("0\n"); continue;} 28 for(int i=0;i<n;i++) 29 { 30 char str[10]; 31 scanf("%s",str); 32 int s=0; 33 for(int j=0;j<m;j++) s=(s<<1)+(str[j]=='#'); 34 mz[i]=s; 35 } 36 memset(d,-1,sizeof(d)); 37 d[0][mz[0]][mz[1]]=0; 38 int s=1<<m; 39 for(int i=0;i<n-2;i++) 40 for(int s0=0;s0<s;s0++) 41 for(int s1=0;s1<s;s1++) if(d[i][s0][s1]>=0) 42 dfs(1,s0,s1,mz[i+2],d[i][s0][s1],i+1); 43 int ans=0; 44 for(int s0=0;s0<s;s0++) 45 for(int s1=0;s1<s;s1++) 46 if(d[n-2][s0][s1]>ans) ans=d[n-2][s0][s1]; 47 printf("%d\n",ans); 48 } 49 return 0; 50 }