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

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            導航

            統計

            常用鏈接

            留言簿(2)

            隨筆分類(65)

            隨筆檔案(65)

            文章檔案(2)

            ACM

            搜索

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            久久AV无码精品人妻糸列| 久久99精品免费一区二区| 久久狠狠爱亚洲综合影院 | 人妻无码αv中文字幕久久 | 久久久久女教师免费一区| 综合久久一区二区三区| 久久99国产综合精品| 久久久久亚洲AV无码去区首| 波多野结衣久久| 亚洲午夜久久影院| 综合久久精品色| 99久久精品国产综合一区| 久久受www免费人成_看片中文| 色88久久久久高潮综合影院| 国产精品va久久久久久久| 久久久久久精品久久久久| 久久久精品日本一区二区三区| 久久国产劲爆AV内射—百度| 国产AⅤ精品一区二区三区久久| 久久人人爽人人人人片av| 国産精品久久久久久久| 精品国产VA久久久久久久冰 | 2021国产精品午夜久久| 久久精品国产99国产精品澳门| 亚洲人成伊人成综合网久久久| 久久AAAA片一区二区| 国产精品热久久毛片| 51久久夜色精品国产| 欧美久久综合性欧美| 国产精品99久久久久久人| 久久狠狠高潮亚洲精品| 亚洲香蕉网久久综合影视| 欧美日韩精品久久久久| 中文字幕无码av激情不卡久久| 国产激情久久久久影院| 久久精品国产99国产精品| 香港aa三级久久三级| 91精品婷婷国产综合久久| 久久精品国产亚洲AV无码麻豆| 久久精品国产亚洲AV高清热 | 久久夜色精品国产欧美乱|