• <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
            很好的運用了位運算。。。三進制狀態(tài)壓縮。。

            #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ǎ崽 閱讀(303) 評論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久青青草原国产精品免费 | 欧美久久精品一级c片片| 久久久久99精品成人片试看| 久久精品国产2020| 久久国产精品-久久精品| 久久996热精品xxxx| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 99久久精品免费国产大片| 久久九九久精品国产| 99精品国产综合久久久久五月天 | 一级a性色生活片久久无| 久久久久久夜精品精品免费啦| 久久国产影院| 久久久一本精品99久久精品88| 久久久久香蕉视频| 久久99精品综合国产首页| 人妻无码αv中文字幕久久琪琪布| 国产∨亚洲V天堂无码久久久| 日韩影院久久| 精品久久久久久无码中文字幕 | 欧美成人免费观看久久| 伊人久久免费视频| 久久超碰97人人做人人爱| 中文字幕无码久久久| 国产福利电影一区二区三区久久久久成人精品综合 | 久久成人小视频| 久久精品一区二区影院| 久久久国产精品福利免费| 亚洲精品乱码久久久久久| 中文字幕精品无码久久久久久3D日动漫 | 人人狠狠综合久久亚洲高清| 久久免费精品视频| 精品精品国产自在久久高清| 久久天堂AV综合合色蜜桃网 | 中文字幕精品无码久久久久久3D日动漫 | 久久精品国产亚洲7777| 欧美精品一本久久男人的天堂| 九九精品99久久久香蕉| 国产精品免费福利久久| 国产∨亚洲V天堂无码久久久| 99久久99这里只有免费的精品|