• <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>
            posts - 7, comments - 13, trackbacks - 0, articles - 37
               :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理

            #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;
            }

             

            日本精品久久久中文字幕| 久久久久99这里有精品10| 精品久久人妻av中文字幕| 国产精品久久久久久福利漫画| 日本免费久久久久久久网站| 欧美久久亚洲精品| 99久久成人国产精品免费| 久久精品无码一区二区app| 人妻无码αv中文字幕久久琪琪布| 色欲综合久久中文字幕网| 一级做a爰片久久毛片人呢| 久久人人爽人人爽人人片AV高清| 久久免费的精品国产V∧| 久久久久久极精品久久久| 久久精品一本到99热免费| 色综合久久天天综线观看| 777米奇久久最新地址| av色综合久久天堂av色综合在| 99精品伊人久久久大香线蕉| 亚洲精品乱码久久久久久蜜桃不卡 | 香港aa三级久久三级| 久久久久久国产精品无码下载| 热久久国产精品| 精品久久久久久无码专区| 伊人精品久久久久7777| 99久久99久久精品国产片| 精品熟女少妇av免费久久| 少妇无套内谢久久久久| 伊人久久五月天| 久久黄视频| 看全色黄大色大片免费久久久| 99久久精品国产综合一区| 国产精品美女久久久| 69国产成人综合久久精品| 久久99精品国产自在现线小黄鸭| 亚洲精品午夜国产VA久久成人| 久久精品国产亚洲AV久| 成人午夜精品无码区久久| 久久青青草原亚洲av无码app| 久久水蜜桃亚洲av无码精品麻豆 | 国产91久久精品一区二区|