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

            整整花了我兩天時間。。。
            唉。。。本來以為是很簡單的
            寫完八數碼后知道了逆序數一個hash函數
            以為寫這題也可以這樣做
            很簡單的寫好后提交結果是TLE。。。唉,數據量太大了。。。
            雖然說最多只有40320個狀態,但由于in文件太大,有40KB,會導致超時。
            所以請教了高杰之后知道可以用雙向廣搜處理。
            這樣時間就少了很多很多
            應為廣搜到后邊狀態是指數級別增長的

            但是寫阿寫,總是寫不對,關鍵是字典序最小的那過很難處理,看了高杰的代碼后還不知所然。。
            昨天晚上請教了linle大牛,他是這題時間最短的人,只用了15MS,用雙向廣搜至少都要2000MS+
            他一語道破玄機,“預處理”,所有狀態到12345678全部先處理出來
            于是我就在想預處理之后能怎么做。。

            先預處理說所有狀態到12345678的字典序最小的最優解
            今天終于想出來了。每個初始狀態都可以轉化成12345678
            比如拿
            47586312
            87654321來說
            可以轉化成
            12345678
            42531687
            接下來就簡單了
            根據預處理出來的路徑打印。。。


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

            評論:
            # re: hdoj1430~~魔板~~解題報告 2009-02-27 18:12 | fdar
            樓主八數碼也寫了啊。
            那能不能把八數碼的A-STAR算法也寫個解題報告啊  回復  更多評論
              
            # re: hdoj1430~~魔板~~解題報告 2009-02-27 20:37 | shǎ崽
            @fdar


            呵呵,好的  回復  更多評論
              
            # re: hdoj1430~~魔板~~解題報告 2009-04-03 22:42 |
            能把代碼提供出來嗎,預處理還是不太懂  回復  更多評論
              
            # re: hdoj1430~~魔板~~解題報告 2009-04-03 22:45 |
            預處理的轉換明白了,但預處理怎么應來解決字典序還是不太懂,請再講明白,謝謝!  回復  更多評論
              
            # re: hdoj1430~~魔板~~解題報告 2009-04-05 17:48 | shǎ崽
            好的  回復  更多評論
              
            91久久国产视频| 国产欧美久久久精品影院| 久久久一本精品99久久精品66| 久久婷婷色综合一区二区| 久久天天躁狠狠躁夜夜96流白浆| 久久人妻少妇嫩草AV无码专区| a高清免费毛片久久| 久久97久久97精品免视看| 久久青青色综合| 久久99精品国产自在现线小黄鸭| 91久久精品电影| 亚洲中文字幕无码久久精品1| 国产成人精品久久一区二区三区 | 久久艹国产| 午夜精品久久久久9999高清| 久久久久久久人妻无码中文字幕爆 | 精品综合久久久久久97| 久久福利青草精品资源站| 国产精品99久久久久久宅男小说| 91精品国产综合久久精品| 久久综合九色综合欧美就去吻| 久久精品国产亚洲av日韩| 蜜桃麻豆www久久国产精品| 精品久久久久久久久午夜福利| 久久天天躁狠狠躁夜夜av浪潮 | 久久精品国产色蜜蜜麻豆| 色成年激情久久综合| 久久水蜜桃亚洲av无码精品麻豆| 伊人久久精品影院| 久久精品无码一区二区三区日韩| .精品久久久麻豆国产精品| 无码人妻久久一区二区三区蜜桃 | 国产三级久久久精品麻豆三级| 久久久久免费精品国产| 久久国产成人精品国产成人亚洲| 国内精品久久久人妻中文字幕| 中文精品久久久久人妻不卡| 人人狠狠综合久久亚洲婷婷| 99久久国语露脸精品国产| 国产成人久久精品一区二区三区 | 国产∨亚洲V天堂无码久久久|