• <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 【經(jīng)典八數(shù)碼問題】


            Accepted 3164K 219MS G++ 3644B



            經(jīng)典題感覺就是不一樣。

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

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

            用康托展開做哈希函數(shù),直接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)//方向理解反了,調(diào)r時其實是調(diào)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;//調(diào)一下輸出順序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 田兵 閱讀(503) 評論(0)  編輯 收藏 引用 所屬分類: POJ

            <2010年8月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            留言簿(2)

            隨筆分類(65)

            隨筆檔案(65)

            文章檔案(2)

            ACM

            搜索

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            精品久久久久久国产| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 人妻无码久久精品| 亚洲精品无码久久千人斩| 99久久精品费精品国产| 久久久久av无码免费网| 国产午夜精品理论片久久| 亚洲国产精品18久久久久久| 国内精品伊人久久久久网站| 91精品国产综合久久精品| 中文字幕无码av激情不卡久久| 一本久久a久久精品综合夜夜| 欧美日韩精品久久免费| 国产成人无码精品久久久久免费| 日日躁夜夜躁狠狠久久AV| 久久久人妻精品无码一区| 四虎国产精品免费久久5151| 成人久久免费网站| 亚洲七七久久精品中文国产| 久久综合久久久| 久久综合丁香激情久久| 九九久久自然熟的香蕉图片| 精品久久久无码21p发布| 亚洲伊人久久成综合人影院| 久久se这里只有精品| 国产亚洲美女精品久久久| segui久久国产精品| 日韩精品久久久久久| 成人久久综合网| 免费观看成人久久网免费观看| 久久精品国产亚洲av麻豆色欲 | 国产精品久久99| 久久99毛片免费观看不卡| 91精品国产9l久久久久| 青青国产成人久久91网| 国产精品99久久不卡| 久久精品无码免费不卡| 久久亚洲视频| 亚洲欧美另类日本久久国产真实乱对白| 国内精品久久久久久不卡影院| 久久99久久成人免费播放|