Qiuqiqiu  
不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!

http://acm.hdu.edu.cn/showproblem.php?pid=2640

View Code
 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 }

 

posted on 2012-07-11 16:43  Qiuqiqiu  阅读(237)  评论(0编辑  收藏  举报