• <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=1430

            整整花了我兩天時(shí)間。。。
            唉。。。本來(lái)以為是很簡(jiǎn)單的
            寫(xiě)完八數(shù)碼后知道了逆序數(shù)一個(gè)hash函數(shù)
            以為寫(xiě)這題也可以這樣做
            很簡(jiǎn)單的寫(xiě)好后提交結(jié)果是TLE。。。唉,數(shù)據(jù)量太大了。。。
            雖然說(shuō)最多只有40320個(gè)狀態(tài),但由于in文件太大,有40KB,會(huì)導(dǎo)致超時(shí)。
            所以請(qǐng)教了高杰之后知道可以用雙向廣搜處理。
            這樣時(shí)間就少了很多很多
            應(yīng)為廣搜到后邊狀態(tài)是指數(shù)級(jí)別增長(zhǎng)的

            但是寫(xiě)阿寫(xiě),總是寫(xiě)不對(duì),關(guān)鍵是字典序最小的那過(guò)很難處理,看了高杰的代碼后還不知所然。。
            昨天晚上請(qǐng)教了linle大牛,他是這題時(shí)間最短的人,只用了15MS,用雙向廣搜至少都要2000MS+
            他一語(yǔ)道破玄機(jī),“預(yù)處理”,所有狀態(tài)到12345678全部先處理出來(lái)
            于是我就在想預(yù)處理之后能怎么做。。

            先預(yù)處理說(shuō)所有狀態(tài)到12345678的字典序最小的最優(yōu)解
            今天終于想出來(lái)了。每個(gè)初始狀態(tài)都可以轉(zhuǎn)化成12345678
            比如拿
            47586312
            87654321來(lái)說(shuō)
            可以轉(zhuǎn)化成
            12345678
            42531687
            接下來(lái)就簡(jiǎn)單了
            根據(jù)預(yù)處理出來(lái)的路徑打印。。。


            #include<stdio.h>
            #include
            <string>
            #define Max 40321
            char num[Max][9];
            int hash[Max];
            int father[Max];
            int ku[] = {1,1,2,6,24,120,720,5040};
            char act[Max];

            int hash_code(char *a)
            {
                
            int i,j,cnt,sum=0;
                
            for(i=0;a[i];i++)
                {
                    cnt 
            = 0;
                    
            for(j=0;j<i;j++)
                    {
                        
            if(a[j]>a[i])
                            cnt 
            ++;
                    }
                    sum 
            += cnt*ku[i];
                }
                
            return sum;
            }
            void change(char *a,char *b,int s)
            {
                
            int i;
                
            char c;
                
            switch (s)
                {
                
            case 0:
                    strcpy(a,b);
                    strrev(a);
                    
            return ;
                
            case 1:
                    a[
            0= b[3];
                    
            for(i=0;i<3;i++)
                        a[i
            +1= b[i];
                    a[
            7= b[4];
                    
            for(i=5;i<=7;i++)
                        a[i
            -1= b[i];        
                    a[
            8= 0;
                    
            return ;
                
            case 2:
                    strcpy(a,b);
                    c 
            = a[5];
                    a[
            5= a[2];
                    a[
            2= a[1];
                    a[
            1= a[6];
                    a[
            6= c;
                    
            return ;
                }
            }
            void bfs()
            {
                
            int head,tail,i,key;
                head 
            = tail = 0;
                
            char next[9];
                
            for(i=0;i<8;i++)
                    num[
            0][i] = i+'1';
                num[
            0][i] = 0;
                memset(hash,
            -1,sizeof(hash));
                hash[hash_code(num[
            0])] = 0;
                
            while(head <= tail)
                {
                    
            for(i=0;i<3;i++)
                    {
                        change(next,num[head],i);
                        key 
            = hash_code(next);
                        
            if(hash[key]==-1)
                        {
                            tail 
            ++;
                            hash[key] 
            = tail;
                            strcpy(num[tail],next);
                            act[tail] 
            = 'A' + i;
                            father[tail] 
            = head;
                        }
                    }
                    head 
            ++;
                }

                tail 
            = 0;
            }
            int main()
            {
                
            char start[9],end[9],ans[100];
                
            int pos[9],i,key;
                bfs();
                
            while(scanf("%s%s",start,end)==2)
                {
                    
            for(i=0;i<8;i++)
                        pos[start[i]
            -'1'= i;
                    
            for(i=0;i<8;i++)
                        end[i] 
            = pos[end[i]-'1'+'1';
                    end[
            8= 0;
                    key 
            = hash[hash_code(end)];
                    i 
            = 0;
                    
            while(key)
                    {
                        ans[i
            ++= act[key];
                        key 
            = father[key];
                    }
                    ans[i] 
            = 0;
                    strrev(ans);
                    puts(ans);
                }
                
            return 0;
            }
            posted on 2009-02-27 16:41 shǎ崽 閱讀(1204) 評(píng)論(5)  編輯 收藏 引用

            評(píng)論:
            # re: hdoj1430~~魔板~~解題報(bào)告 2009-02-27 18:12 | fdar
            樓主八數(shù)碼也寫(xiě)了啊。
            那能不能把八數(shù)碼的A-STAR算法也寫(xiě)個(gè)解題報(bào)告啊  回復(fù)  更多評(píng)論
              
            # re: hdoj1430~~魔板~~解題報(bào)告 2009-02-27 20:37 | shǎ崽
            @fdar


            呵呵,好的  回復(fù)  更多評(píng)論
              
            # re: hdoj1430~~魔板~~解題報(bào)告 2009-04-03 22:42 |
            能把代碼提供出來(lái)嗎,預(yù)處理還是不太懂  回復(fù)  更多評(píng)論
              
            # re: hdoj1430~~魔板~~解題報(bào)告 2009-04-03 22:45 |
            預(yù)處理的轉(zhuǎn)換明白了,但預(yù)處理怎么應(yīng)來(lái)解決字典序還是不太懂,請(qǐng)?jiān)僦v明白,謝謝!  回復(fù)  更多評(píng)論
              
            # re: hdoj1430~~魔板~~解題報(bào)告 2009-04-05 17:48 | shǎ崽

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


            国产成人精品三上悠亚久久| 久久国产热这里只有精品| 久久久国产精华液| 精品蜜臀久久久久99网站| 久久中文字幕无码专区| 波多野结衣AV无码久久一区| 久久久久久久久无码精品亚洲日韩 | 久久久久久噜噜精品免费直播| 久久久国产99久久国产一| 91精品国产色综合久久| 久久无码一区二区三区少妇| 日产精品久久久一区二区| 国产成人综合久久久久久| 波多野结衣AV无码久久一区| 爱做久久久久久| 久久综合噜噜激激的五月天| 久久久久久亚洲精品不卡| 69国产成人综合久久精品| 婷婷久久综合九色综合绿巨人| av无码久久久久不卡免费网站| 伊人久久五月天| 九九久久精品无码专区| 99精品久久精品| 久久亚洲AV成人无码软件| 久久国产综合精品五月天| 久久99精品国产99久久| 久久发布国产伦子伦精品| 久久久久久久久久久精品尤物 | 久久精品人人做人人爽电影| 国内精品久久久久影院网站| 久久96国产精品久久久| 中文字幕热久久久久久久| 国产精品久久久久a影院| 青草久久久国产线免观| 狠狠久久综合| 精品久久国产一区二区三区香蕉 | 人妻丰满AV无码久久不卡| 99久久这里只精品国产免费 | 亚洲国产成人久久综合一| 国产亚洲精品自在久久| 国产精品久久久久影院嫩草 |