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

            poj 1077 Eight 【經典八數碼問題】


            Accepted 3164K 219MS G++ 3644B



            經典題感覺就是不一樣。

            總是花了很長時間浪費在一些無關緊要的地方,把方向理解錯了,正好相反的,調了N久。

            后來輸出的時候,都往反方向輸出A了。

            用康托展開做哈希函數,直接BFS就可以了

            #include<iostream>
            #include<cstring>
            using namespace std;

            int fac[10]={1,1,2,6,24,120,720,5040,40320,362880};
            void swap(int &a, int &b)
            {
                 int t=a; a=b; b=t;
            }
            int cantor(int x)
            {
                int a[10]={0};
                for(int i=9; i>=1; i--)
                {
                        a[i]=x%10;
                        x/=10;
                }
                int ans=0;
                for(int i=1; i<=9; i++)
                {
                        int c=0;
                        for(int j=i+1; j<=9; j++)
                                if(a[j]<a[i])c++;
                        ans+=c*fac[a[i]-1];      
                }
                return ans;
            }

            struct type
            {
                   int last;
                   int now;
                   int move;
            }Q[362885];

            bool used[362885]={0};

            bool change(int &x, int ch)//方向理解反了,調r時其實是調l
            {
                 int status[4][4],temp=x;
                 int row,column;
                 for(int i=3; i>=1; i--)
                         for(int j=3; j>=1; j--)
                         {
                                 status[i][j]=temp%10;
                                 temp/=10;
                                 if(status[i][j]==9)
                                 {  row=i; column=j; }            
                         }
                 switch(ch)
                 {
                           case 1: if(column==1)return false;  //r
                                     swap(status[row][column], status[row][column-1]); break;
                           case 2: if(column==3)return false;  //l
                                     swap(status[row][column], status[row][column+1]);break;
                           case 3: if(row==3)return false;     //u
                                     swap(status[row][column], status[row+1][column]); break;
                           case 4: if(row==1) return false;    //d
                                     swap(status[row][column], status[row-1][column]); break;
                 }
                 temp=0;
                 for(int i=1; i<=3; i++)
                 for(int j=1; j<=3; j++)
                         temp=temp*10+status[i][j];
                 x=temp;
                 return true;
            }

            int main()
            {
                int now=0;
                int goal=0;
                char t;
                for(int i=1; i<=9; i++)
                {
                        cin>>t;
                        if(t=='x')t='9';
                        now=now*10+int(t-'0');
                }       
                int l=1,r=1;
                Q[1].last=0; Q[1].now=now;
                int x=cantor(now);
                used[x]=1;
                bool find=false;
                while(l<=r&&find==false&&r<=362881)
                {
                      int num=Q[l].now, can;
                      int temp;
                      //system("pause");
                      for(int i=1; i<=4; i++)
                      {
                              temp=num;
                              if(change(temp,i))
                              {
                                               can=cantor(temp);
                                               if(!used[can])
                                               {
                                                             used[can]=true;     
                                                             r++;
                                                             Q[r].now=temp;
                                                             Q[r].last=l;
                                                             Q[r].move=i;
                                               }
                                               if(can==goal){find=true; break; }
                              }
                      }
                     l++;
                }         
               
                if(find==false)cout<<"unsolvable"<<endl;
                else
                {
                     int ans[1000];  int len=0;
                    
                     for( ;r!=1; )
                     {
                         
                          len++;
                          ans[len]=Q[r].move;
                          r=Q[r].last;
                     }
                     for(int i=len; i>=1; i--)
                     {
                             switch(ans[i])
                             {
                                             case 2:cout<<'r';break;//調一下輸出順序A了
                                             case 1:cout<<'l';break;
                                             case 4:cout<<'u';break;
                                             case 3:cout<<'d';break;
                             }
                     }
                 cout<<endl;   
                }
               
                system("pause");
                return 0;
            }

            posted on 2010-08-20 11:04 田兵 閱讀(491) 評論(0)  編輯 收藏 引用 所屬分類: POJ

            <2010年5月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            導航

            統計

            常用鏈接

            留言簿(2)

            隨筆分類(65)

            隨筆檔案(65)

            文章檔案(2)

            ACM

            搜索

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            欧美一区二区三区久久综| 一级女性全黄久久生活片免费| 色狠狠久久综合网| 欧美国产成人久久精品| 香蕉久久夜色精品升级完成| 久久国产亚洲精品麻豆| 久久久噜噜噜久久| 国产人久久人人人人爽| 久久99精品国产麻豆婷婷| 性高湖久久久久久久久| 久久久无码精品午夜| 国产精品无码久久综合 | 久久伊人色| 久久久久久午夜成人影院| 久久久久国产一区二区| 久久亚洲私人国产精品| 亚洲综合久久夜AV | 嫩草影院久久99| 久久永久免费人妻精品下载| 久久久久亚洲AV无码专区桃色 | 久久精品亚洲精品国产欧美| 久久丫精品国产亚洲av| 青青草原综合久久大伊人| 久久se精品一区二区影院| 久久精品无码一区二区三区| 国内精品伊人久久久久777| 久久人人爽人人人人爽AV| 久久婷婷五月综合色99啪ak| 国产精品免费久久| 日本免费久久久久久久网站| 69久久精品无码一区二区| 久久综合综合久久综合| 国内精品久久久久伊人av| 91久久精品91久久性色| 国内精品久久久久伊人av| 久久91综合国产91久久精品| 久久精品国产第一区二区三区| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 国产精品久久久久久久久久影院| 国产精品成人99久久久久| 久久久久久久国产免费看|