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

            The Fourth Dimension Space

            枯葉北風(fēng)寒,忽然年以殘,念往昔,語默心酸。二十光陰無一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢令

            ACRUSH(樓天成)八數(shù)碼問題源代碼

            題目描述
            八方塊移動游戲要求從一個含8個數(shù)字(用1-8表示)的方塊以及一個空格方塊(用0表示)的3x3矩陣的起始狀態(tài)開始,不斷移動該空格方塊以使其和相鄰的方塊互換,直至達到所定義的目標(biāo)狀態(tài)。空格方塊在中間位置時有上、下、左、右4個方向可移動,在四個角落上有2個方向可移動,在其他位置上有3個方向可移動。例如,假設(shè)一個3x3矩陣的初始狀態(tài)為:
               8 0 3
               2 1 4
               7 6 5
            目標(biāo)狀態(tài)為:
               1 2 3
               8 0 4
               7 6 5
            則一個合法的移動路徑為:
               8 0 3    8 1 3    8 1 3    0 1 3    1 0 3    1 2 3
               2 1 4 => 2 0 4 => 0 2 4 => 8 2 4 => 8 2 4 => 8 0 4
               7 6 5    7 6 5    7 6 5    7 6 5    7 6 5    7 6 5

            另外,在所有可能的從初始狀態(tài)到目標(biāo)狀態(tài)的移動路徑中,步數(shù)最少的路徑被稱為最短路徑;在上面的例子中,最短路徑為5。如果不存在從初試狀態(tài)到目標(biāo)狀態(tài)的任何路徑,則稱該組狀態(tài)無解。

            請設(shè)計有效的(細(xì)節(jié)請見評分規(guī)則)算法找到從八方塊的某初試狀態(tài)到某目標(biāo)狀態(tài)的所有可能路徑中的最短路徑,并用C/C++實現(xiàn)。

            輸入數(shù)據(jù)
            程序需讀入已被命名為start.txt的初始狀態(tài)和已被命名為goal.txt的目標(biāo)狀態(tài),這兩個文件都由9個數(shù)字組成(0表示空格,1-8表示8個數(shù)字方塊),每行3個數(shù)字,數(shù)字之間用空格隔開。

            輸出數(shù)據(jù)
            如果輸入數(shù)據(jù)有解,輸出一個表示最短路徑的非負(fù)的整數(shù);如果輸入數(shù)據(jù)無解,輸出-1。

            自測用例
            如果輸入為:start.txtgoal.txt,則產(chǎn)生的輸出應(yīng)為:
            5

            又例,如果用
            7 8 4
            3 5 6
            1 0 2
            替換start.txt中的內(nèi)容,則產(chǎn)生的輸出應(yīng)為:
            21

            評分規(guī)則
            1)我們將首先使用和自測用例不同的10個start.txt以及相同的goal.txt,每個測試用例的運行時間在一臺Intel Xeon 2.80GHz 4 CPU/6G 內(nèi)存的Linux機器上應(yīng)不超過10秒(內(nèi)存使用不限制),否則該用例不得分;

            2)每個選手的總分(精確到小數(shù)點后6位)=10秒鐘內(nèi)能產(chǎn)生正確結(jié)果的測試用例數(shù)量x10+(1/產(chǎn)生這些正確結(jié)果的測試用例的平均運行毫秒);

            3)如果按此評分統(tǒng)計仍不能得出總決賽將決出的一、二、三等獎共計九名獲獎?wù)撸覀儗⑾仍O(shè)N=2,然后重復(fù)下述過程直至產(chǎn)生最高的9位得分:用隨機生成的另外10個有解的start.txt再做測試,并對這10*N個測試用例用2)中公式重新計算總分,N++。



            //冠軍ACRush的代碼: 
            //轉(zhuǎn)載自:http://star.baidu.com/data/demo/ACRush.txt 

            #include 
            <stdio.h> 
            #include 
            <stdlib.h> 
            #include 
            <string.h> 

            const int hashsize=70001
            const int maxnode=50000
            const int maxp=40
            const int ten[]={1,10,100,1000,10000,100000,1000000,10000000,100000000}
            const int C[]={2,3,2,3,4,3,2,3,2}
            const int EP[][4]={{1,3,0,0},{0,2,4,0},{1,5,0,0},{0,4,6,0},{1,3,5,7},{2,4,8,0},{3,7,0,0},{4,6,8,0},{5,7,0,0}}

            struct Tlist 

              
            int data,d; 
              Tlist 
            *next; 
            }

            struct Thashpoint 

              
            int data; 
              Thashpoint 
            *next; 
            }

            //Memory 
            int ID; 
            Tlist listM[maxnode],
            *q; 
            Thashpoint hashM[maxnode],
            *p; 
            //data 
            int src,dest; 
            //heap 
            Tlist *head[maxp],*expand[maxp],*lp1,*lp2; 
            //Hash 
            Thashpoint *hash[hashsize]; 
            //expand 
            int nowp,A[9],arcT[9],dist[9][9],b,depth,swap[9][9]; 
            int data,G,newdata,newG; 
            bool find_answer; 

            void readdata(const char *filename,int &data) 

              
            int i,v; 
              FILE 
            *f=fopen(filename,"r"); 
              data
            =0
              
            for (i=0;i<9;i++
              

                fscanf(f,
            "%d",&v); 
                data
            =data+v*ten[i]; 
              }
             
              fclose(f); 
            }
             
            bool check_noanswer() 

              
            int p[9],i,b1,b2; 
              
            bool vis[9]; 
              
            for (i=0;i<9;i++
                p[i]
            =arcT[src/ten[i]%10]; 
              
            for (b1=0; src/ten[b1]%10!=0;b1++); 
              
            for (b2=0;dest/ten[b2]%10!=0;b2++); 
              
            int countP=0
              memset(vis,
            false,sizeof(vis)); 
              
            for (i=0;i<9;i++
                
            if (!vis[i]) 
                

                  countP
            ++
                  
            for (int k=i;!vis[k];k=p[k]) 
                    vis[k]
            =true
                }
             
              
            return (countP-dist[b1][b2])%2==0
            }
             
            void preprocess() 

              ID
            =0
              find_answer
            =false
              memset(hash,
            0,sizeof(hash)); 
              memset(head,
            0,sizeof(head)); 
              memset(expand,
            0,sizeof(expand)); 
              
            for (int k=0;k<9;k++
                arcT[dest
            /ten[k]%10]=k; 
              
            for (int u=0;u<9;u++
                
            for (int v=0;v<9;v++
                

                  dist[u][v]
            =abs(u/3-v/3)+abs(u%3-v%3); 
                  swap[u][v]
            =ten[u]-ten[v]; 
                }
             
            }
             
            void addnode() 

              
            if (newdata==dest) 
              

                printf(
            "%d\n",depth); 
                find_answer
            =true
                
            return
              }
             
              
            int address=newdata%hashsize; 
              
            for (p=hash[address];p!=NULL;p=p->next) 
                
            if (p->data==newdata) 
                  
            return
              
            if (ID==maxnode) 
                
            return
              p
            =&hashM[ID]; 
              p
            ->data=newdata; 
              p
            ->next=hash[address]; 
              hash[address]
            =p; 
              q
            =&listM[ID]; 
              ID
            ++
              q
            ->data=newdata; 
              q
            ->d=depth; 
              
            if (newG>=maxp) 
                
            return
              
            if (newG==nowp) 
              

                q
            ->next=expand[depth]; 
                expand[depth]
            =q; 
              }
             
              
            else 
              

                q
            ->next=head[newG]; 
                head[newG]
            =q; 
              }
             
            }
             
            void solve() 

              nowp
            =-1
              newdata
            =src; 
              newG
            =0
              
            for (int k=0;k<9;k++
                
            if (src/ten[k]%10!=0
                  newG
            +=dist[arcT[src/ten[k]%10]][k]; 
              depth
            =0
              addnode(); 
              
            if (find_answer) 
                
            return
              
            for (int p=0;p<maxp;p++if (head[p]!=NULL) 
              

                nowp
            =p; 
                
            for (lp1=head[p];lp1!=NULL;lp1=lp2) 
                

                  lp2
            =lp1->next; 
                  lp1
            ->next=expand[lp1->d]; 
                  expand[lp1
            ->d]=lp1; 
                }
             
                
            for (int d=0;d<=p;d++
                  
            for (;expand[d]!=NULL;) 
                  

                    data
            =expand[d]->data; 
                    G
            =p-expand[d]->d; 
                    depth
            =expand[d]->d+1
                    expand[d]
            ->d=-2
                    expand[d]
            =expand[d]->next; 
                    
            for (b=0;data/ten[b]%10!=0;b++); 
                    
            for (int v=0;v<C[b];v++
                    

                      
            int u=EP[b][v]; 
                      
            int c=data/ten[u]%10
                      newdata
            =data+swap[b][u]*c; 
                      c
            =arcT[c]; 
                      newG
            =depth+G-dist[c][u]+dist[c][b]; 
                      addnode(); 
                      
            if (find_answer) 
                        
            return
                    }
             
                  }
             
              }
             
              printf(
            "-1\n"); 
            }
             
            int main() 

              readdata(
            "start.txt",src); 
              readdata(
            "goal.txt",dest); 
              preprocess(); 
              
            if (check_noanswer()) 
                printf(
            "-1\n"); 
              
            else 
                solve(); 
              
            return 0
            }
             

            posted on 2009-05-22 02:24 abilitytao 閱讀(18270) 評論(6)  編輯 收藏 引用

            評論

            # re: ACRUSH(樓天成)八數(shù)碼問題源代碼 2009-11-22 19:56 張甡華

            八數(shù)碼問題存在沒解的可能性嗎?(排除目標(biāo)不是初始狀態(tài)的一個排列的情況)

            qq:46522649  回復(fù)  更多評論   

            # re: ACRUSH(樓天成)八數(shù)碼問題源代碼 2010-12-10 12:47 zlly

            orz abilitytao   回復(fù)  更多評論   

            # re: ACRUSH(樓天成)八數(shù)碼問題源代碼 2011-09-28 22:23 夜痕

            @張甡華
            應(yīng)該是存在的  回復(fù)  更多評論   

            # re: ACRUSH(樓天成)八數(shù)碼問題源代碼 2015-04-07 22:09 cai ji

            我嚴(yán)重懷疑樓天城違反比賽規(guī)則,依我看樓天城用的是c的代碼 卻用的是c++的編譯器
            c里面不可能struct 這么定義這么實用的。必須有struct符號,而且看他的代碼很多處還實用引用這個c里面沒有的概念  回復(fù)  更多評論   

            # re: ACRUSH(樓天成)八數(shù)碼問題源代碼[未登錄] 2015-07-18 14:19 123

            @cai ji
            你逗呀,特么的都說了可以用c/c++。。。  回復(fù)  更多評論   

            # re: ACRUSH(樓天成)八數(shù)碼問題源代碼 2015-10-20 16:54 dgsdg 1

            gadrgadfg  回復(fù)  更多評論   

            日产久久强奸免费的看| 亚洲狠狠婷婷综合久久蜜芽| 亚洲香蕉网久久综合影视| 久久久久亚洲爆乳少妇无| 99久久伊人精品综合观看| 99久久国语露脸精品国产| 久久九九精品99国产精品| 色88久久久久高潮综合影院| 久久久久久久久久久久久久| 久久精品国产亚洲av麻豆图片| 久久亚洲熟女cc98cm| 久久亚洲AV无码精品色午夜麻豆| 久久这里的只有是精品23| 久久亚洲AV成人无码软件 | 久久国产成人精品麻豆| 精品国产91久久久久久久 | 性高湖久久久久久久久AAAAA| 国产69精品久久久久99尤物| 久久av免费天堂小草播放| 婷婷久久综合| 久久亚洲私人国产精品vA| 国产一久久香蕉国产线看观看| 久久国产精品一区二区| 久久精品国产亚洲7777| 亚洲国产精品无码久久青草| 久久久久av无码免费网| 久久99精品久久久久婷婷| 91麻豆精品国产91久久久久久 | 久久久久免费视频| 国产精品久久久久a影院| 久久久久99精品成人片直播| 亚洲国产精品婷婷久久| 伊人久久大香线蕉成人| 久久久久亚洲AV无码麻豆| 久久99精品久久久久久水蜜桃| 亚洲日本久久久午夜精品| 久久久久久亚洲AV无码专区| 国产精品久久久久久久久久免费| 久久天天躁夜夜躁狠狠| 国产69精品久久久久9999| 国产A三级久久精品|