• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-72  評論-126  文章-0  trackbacks-0
            http://acm.hdu.edu.cn/showproblem.php?pid=2269
            很好的運用了位運算。。。三進制狀態壓縮。。

            #include<stdio.h>
            #include
            <string>
            char hash[177148]={0};
            char thing[11][21];
            int n;
            struct Q{
                
            short int tep,b,c;
            }q[
            177148];
            int head,tail,empty,K=1;
            int ku[] = {1,3,9,27,81,243,729,2187,6561,19683,59049};
            int ku2[] = {1,2,4,8,16,32,64,128,256,512,1024};
            bool eat[2048];
            bool flag;
            int maxt,a,b,c;

            int find(char a[]) {
                
            int i;
                
            for(i=0;i<n;i++)
                    
            if(strcmp(a,thing[i])==0)
                        
            return i;
                
            return -1;
            }
            void GetEat()
            {
                
            char buf[11],str[999];
                
            int i,j,a,num=0;
                j 
            = 0;
                gets(str);
                
            for(i=0;str[i];i++)
                {
                    
            if(str[i]==' ')
                    {
                        buf[j] 
            = 0;
                        j 
            = 0;
                        a 
            = find(buf);
                        
            if(a>=0)
                            num 
            += ku2[a];
                    }
                    
            else
                        buf[j
            ++= str[i];
                }
                buf[j] 
            = 0;
                a 
            = find(buf);
                
            if(a>=0)
                    num 
            += ku2[a];

                
            int max = (1<<n)-1;
                
            for(i=num;i<=max;i++)
                    
            if((i&num)==num)
                        eat[i] 
            = true;
            }
            bool _hash(int b,int c)
            {
                
            int i;
                
            int sum = 0;
                
            for(i=0;i<&& (b||c);i++)
                {
                    sum 
            += (b&1)*ku[i] + (c&1)*ku[i]*2;
                    b 
            >>= 1;
                    c 
            >>= 1;
                }
                
            if(hash[sum]!=K) {
                    hash[sum] 
            = K;
                    
            return true;
                }
                
            return false;
            }
            void dfs(int start,int maxt,int &x)
            {
                
            if(maxt<0)
                    
            return ;
                
            if(!eat[x] && _hash(b,c))
                {
                    tail 
            ++;
                    q[tail].b 
            = b;
                    q[tail].c 
            = c;
                    q[tail].tep 
            = q[head].tep + 1;
                }
                
            if(maxt==0)
                    
            return ;
                
            for(int i=start;i<n;i++)
                {
                    
            int k = 1<<i;
                    
            if((x&k)==k)
                    {
                        x 
            -= k;
                        b 
            += k;
                        
            if(c==0)
                            flag 
            = true;
                        dfs(i
            +1,maxt-1,x);
                        
            if(flag)
                            
            return ;
                        b 
            -= k;
                        x 
            += k;
                    }
                }
            }
            int bfs()
            {
                head 
            = tail = 0;
                q[head].b 
            = 0;
                q[head].c 
            = (1<<n) - 1;
                q[head].tep 
            = 0;
                flag 
            = false;
                
            while(head <= tail)
                {
                    a 
            = (1<<n) - 1;
                    b 
            = q[head].b;
                    c 
            = q[head].c;
                    a 
            ^= (b|c);
                    
            if(q[head].tep&1) {
                        a 
            = a|b;
                        b 
            = 0;
                        dfs(
            0,maxt,a);
                    }
                    
            else {
                        c 
            = c|b;
                        b 
            = 0;
                        dfs(
            0,maxt,c);
                    }
                    
            if(flag)
                        
            return q[head].tep + 1;
                    head 
            ++;
                }
                
            return -1;
            }
            int main()
            {
                
            int m,i;
                
            while(scanf("%d%d%d",&n,&m,&maxt)==3)
                {
                    
            for(i=0;i<n;i++)
                        scanf(
            "%s",thing[i]);
                    getchar();
                    memset(eat,
            false,sizeof(eat));
                    
            for(i=0;i<m;i++)
                        GetEat();
                    
            if(maxt>=n) {
                        puts(
            "1");
                        
            continue;
                    }
                    printf(
            "%d\n",bfs());
                    K 
            ++;
                }
                
            return 0;
            }


            posted on 2009-03-22 10:05 shǎ崽 閱讀(302) 評論(0)  編輯 收藏 引用
            欧美久久久久久| 国产成人99久久亚洲综合精品| 国产精品女同久久久久电影院| 热RE99久久精品国产66热| 青青草原综合久久大伊人精品| 精品久久久久久无码专区| 亚洲香蕉网久久综合影视| 亚洲国产成人精品91久久久| 久久久久久毛片免费看| 久久久久亚洲AV无码专区网站| 嫩草影院久久国产精品| 丰满少妇人妻久久久久久4| 2021国产成人精品久久| 久久精品亚洲男人的天堂| 久久人人爽人人爽人人片AV麻豆| 久久久久亚洲AV综合波多野结衣| 一本久久精品一区二区| 伊人久久大香线蕉av一区| 色综合久久久久综合体桃花网 | 久久精品视频一| 久久久久99这里有精品10| 日韩av无码久久精品免费| 国产成人精品久久免费动漫 | 国产偷久久久精品专区 | 国产精品99久久久久久人| 伊人久久综在合线亚洲2019| 久久久网中文字幕| 伊人久久综合精品无码AV专区| 精品永久久福利一区二区 | 欧美喷潮久久久XXXXx| 亚洲国产精品久久久久婷婷老年| 日批日出水久久亚洲精品tv| 亚洲成色WWW久久网站| 国产精品99久久不卡| 精品久久亚洲中文无码| 国产亚洲色婷婷久久99精品91| 一本色综合网久久| 久久影院亚洲一区| 久久久女人与动物群交毛片| 国产精品美女久久久久AV福利 | 亚洲欧美另类日本久久国产真实乱对白 |