• <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  評(píng)論-126  文章-0  trackbacks-0
            http://acm.hdu.edu.cn/showproblem.php?pid=2269
            很好的運(yùn)用了位運(yùn)算。。。三進(jìn)制狀態(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) 評(píng)論(0)  編輯 收藏 引用

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


            久久人妻少妇嫩草AV无码专区| 久久免费视频网站| 久久综合九色综合欧美就去吻| 久久激情五月丁香伊人| 久久伊人五月丁香狠狠色| 欧美精品久久久久久久自慰| 91精品日韩人妻无码久久不卡| 日日狠狠久久偷偷色综合免费| 久久久久久国产a免费观看黄色大片 | 久久久久久久久久久久久久 | 亚洲国产精品久久久久网站 | 人妻无码中文久久久久专区| 青青青伊人色综合久久| 精品久久久久久久久免费影院| 99国产欧美精品久久久蜜芽| 无码任你躁久久久久久老妇| 999久久久无码国产精品| yy6080久久| 久久精品免费大片国产大片| 无码精品久久久久久人妻中字| 久久久久九国产精品| 久久久久国产精品| 国产精品9999久久久久| 久久中文字幕人妻丝袜| 青青草国产97免久久费观看| 91久久成人免费| 97久久精品人人澡人人爽| 国产精品久久久亚洲| 伊人久久综合成人网| 久久综合久久美利坚合众国| 久久久久亚洲AV成人网| 国产亚洲精午夜久久久久久 | 精品久久久久久综合日本| 亚洲AV无码一区东京热久久| 久久综合九色综合网站| 中文字幕热久久久久久久| 国色天香久久久久久久小说| 亚洲伊人久久成综合人影院 | 久久久久国产| 一级a性色生活片久久无| 久久亚洲精品无码播放|