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

            infinity

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              36 隨筆 :: 0 文章 :: 25 評論 :: 0 Trackbacks
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1077

            Description

            The 15-puzzle has been around for over 100 years; even if you don't know it by that name, you've seen it. It is constructed with 15 sliding tiles, each with a number from 1 to 15 on it, and all packed into a 4 by 4 frame with one tile missing. Let's call the missing tile 'x'; the object of the puzzle is to arrange the tiles so that they are ordered as:
             1  2  3  4
            
            5 6 7 8
            9 10 11 12
            13 14 15 x

            where the only legal operation is to exchange 'x' with one of the tiles with which it shares an edge. As an example, the following sequence of moves solves a slightly scrambled puzzle:
             1  2  3  4    1  2  3  4    1  2  3  4    1  2  3  4
            
            5 6 7 8 5 6 7 8 5 6 7 8 5 6 7 8
            9 x 10 12 9 10 x 12 9 10 11 12 9 10 11 12
            13 14 11 15 13 14 11 15 13 14 x 15 13 14 15 x
            r-> d-> r->

            The letters in the previous row indicate which neighbor of the 'x' tile is swapped with the 'x' tile at each step; legal values are 'r','l','u' and 'd', for right, left, up, and down, respectively.

            Not all puzzles can be solved; in 1870, a man named Sam Loyd was famous for distributing an unsolvable version of the puzzle, and
            frustrating many people. In fact, all you have to do to make a regular puzzle into an unsolvable one is to swap two tiles (not counting the missing 'x' tile, of course).

            In this problem, you will write a program for solving the less well-known 8-puzzle, composed of tiles on a three by three
            arrangement.

            Input

            You will receive a description of a configuration of the 8 puzzle. The description is just a list of the tiles in their initial positions, with the rows listed from top to bottom, and the tiles listed from left to right within a row, where the tiles are represented by numbers 1 to 8, plus 'x'. For example, this puzzle
             1  2  3
            
            x 4 6
            7 5 8

            is described by this list:

            1 2 3 x 4 6 7 5 8

            Output

            You will print to standard output either the word ``unsolvable'', if the puzzle has no solution, or a string consisting entirely of the letters 'r', 'l', 'u' and 'd' that describes a series of moves that produce a solution. The string should include no spaces and start at the beginning of the line.

            Sample Input

             2  3  4  1  5  x  7  6  8 

            Sample Output

            ullddrurdllurdruldr

            Source

            South Central USA 1998


            八數碼 經典的BFS啊, 我就直接用的單向的BFS,也過了,雙向的應該會快很多。
            判重的hash函數看的discuss里的,用逆序數,9!種情況,一一對應,不會有重復的。


             

            Source Code
            Problem: 1077
            User: lovecanon
            Memory: 9572K
            Time: 125MS
            Language: GCC
            Result: Accepted
            • Source Code
            • 
                  
              #include<stdio.h>
              #include
              <string.h>
              #include
              <stdlib.h>
              struct node
              {
                  
              int state[3][3];
                  
              int pre;
                  
              int dir;
              }queue[
              362881];
              int hash[362881];
              int step[362881];
              int a[3][3];

              int fac(int i)
              {
                  
              switch(i)
                  {
                      
              case 0return 1;
                      
              case 1return 1;
                      
              case 2return 2;
                      
              case 3return 6;
                      
              case 4return 24;
                      
              case 5return 120;
                      
              case 6return 720;
                      
              case 7return 5040;
                      
              case 8return 40320;
                  }
                  
              return 0;
              }

              int HASH()
              {
                  
              int i,j,k=0,b[9],ret=0,num=0;
                  
              for(i=0;i<3;i++)
                      
              for(j=0;j<3;j++)
                          b[k
              ++]=a[i][j];
                  
              for(i=0;i<9;i++)
                  {
                      num
              =0;
                      
              for(j=0;j<i;j++)
                          
              if(b[j]>b[i])  num++;
                      ret
              +=fac(i)*num;
                  }
                  
              return ret;
              }

              void output(int len)
              {
                  
              int i;
                  
              for(i=len;i>=0;i--
                  {
                      
              if(step[i]==1) printf("l");
                      
              if(step[i]==2) printf("r");
                      
              if(step[i]==3) printf("u");
                      
              if(step[i]==4) printf("d");
                  }
                  printf(
              "\n");
              }

              int main()
              {
                  
              char s[10];
                  
              int i,j,rear=0,front=0,tag=0;

                  rear
              ++;
                  
              for(i=0;i<3;i++)
                      
              for(j=0;j<3;j++)
                      {
                          scanf(
              "%s",s);
                          
              if(s[0]=='x')  s[0]='9';
                          queue[rear].state[i][j]
              =s[0]-'0';
                      }
                  queue[rear].pre
              =0;queue[rear].dir=0;
                  
              for(i=0;i<3;i++)
                      
              for(j=0;j<3;j++)
                          a[i][j]
              =queue[rear].state[i][j];

                  hash[HASH()]
              =1;
                  
              while(front<rear)
                  {
                      
              int e,f,tmp,cntdir,len;
                      front
              ++;
                      
              for(i=0;i<3;i++)
                          
              for(j=0;j<3;j++)
                          {
                              a[i][j]
              =queue[front].state[i][j];
                              
              if(a[i][j]==9) {e=i;f=j;}
                          }
                      
              if(f-1>=0)
                      {
                          cntdir
              =1;
                          tmp
              =a[e][f];
                          a[e][f]
              =a[e][f-1];
                          a[e][f
              -1]=tmp;
                          tmp
              =HASH();
                          
              if(tmp==0
                          {
                              
              int t=front;
                              len
              =0;
                              step[len
              ++]=cntdir;
                              
              while(queue[t].pre)  
                              {
                                  step[len
              ++]=queue[t].dir;
                                  t
              =queue[t].pre;
                              }
                              output(len);
                              
              return 0;
                          }
                          
              if(!hash[tmp]) 
                          {
                              rear
              ++;
                              
              for(i=0;i<3;i++)
                                  
              for(j=0;j<3;j++)
                                      queue[rear].state[i][j]
              =a[i][j];
                              queue[rear].dir
              =cntdir;queue[rear].pre=front;
                              hash[tmp]
              =1;

                          }
                          tmp
              =a[e][f];
                          a[e][f]
              =a[e][f-1];
                          a[e][f
              -1]=tmp;
                      }
                      
              if(f+1<3)
                      {
                          cntdir
              =2;
                          tmp
              =a[e][f];
                          a[e][f]
              =a[e][f+1];
                          a[e][f
              +1]=tmp;
                          tmp
              =HASH();
                          
              if(tmp==0
                          {
                              
              int t=front;
                              len
              =0;
                              step[len
              ++]=cntdir;
                              
              while(queue[t].pre)  
                              {
                                  step[len
              ++]=queue[t].dir;
                                  t
              =queue[t].pre;
                              }
                              output(len);
                              
              return 0;
                          }
                          
              if(!hash[tmp]) 
                          {
                              rear
              ++;
                              
              for(i=0;i<3;i++)
                                  
              for(j=0;j<3;j++)
                                      queue[rear].state[i][j]
              =a[i][j];
                              queue[rear].dir
              =cntdir;queue[rear].pre=front;
                              hash[tmp]
              =1;
                          }
                          tmp
              =a[e][f];
                          a[e][f]
              =a[e][f+1];
                          a[e][f
              +1]=tmp;
                      }
                      
              if(e-1>=0)
                      {
                          cntdir
              =3;
                          tmp
              =a[e][f];
                          a[e][f]
              =a[e-1][f];
                          a[e
              -1][f]=tmp;
                          tmp
              =HASH();
                          
              if(tmp==0
                          {
                              
              int t=front;
                              len
              =0;
                              step[len
              ++]=cntdir;
                              
              while(queue[t].pre)  
                              {
                                  step[len
              ++]=queue[t].dir;
                                  t
              =queue[t].pre;
                              }
                              output(len);
                              
              return 0;
                          }
                          
              if(!hash[tmp]) 
                          {
                              rear
              ++;
                              
              for(i=0;i<3;i++)
                                  
              for(j=0;j<3;j++)
                                      queue[rear].state[i][j]
              =a[i][j];
                              queue[rear].dir
              =cntdir;queue[rear].pre=front;
                              hash[tmp]
              =1;

                          }
                          tmp
              =a[e][f];
                          a[e][f]
              =a[e-1][f];
                          a[e
              -1][f]=tmp;
                      }
                      
              if(e+1<3)
                      {
                          cntdir
              =4;
                          tmp
              =a[e+1][f];
                          a[e
              +1][f]=a[e][f];
                          a[e][f]
              =tmp;
                          tmp
              =HASH();
                          
              if(tmp==0
                          {
                              
              int t=front;
                              len
              =0;
                              step[len
              ++]=cntdir;
                              
              while(queue[t].pre)  
                              {
                                  step[len
              ++]=queue[t].dir;
                                  t
              =queue[t].pre;
                              }
                              output(len);
                              
              return 0;
                          }
                          
              if(!hash[tmp]) 
                          {
                              rear
              ++;
                              
              for(i=0;i<3;i++)
                                  
              for(j=0;j<3;j++)
                                      queue[rear].state[i][j]
              =a[i][j];
                              queue[rear].dir
              =cntdir;queue[rear].pre=front;
                              hash[tmp]
              =1;

                          }
                          tmp
              =a[e+1][f];
                          a[e
              +1][f]=a[e][f];
                          a[e][f]
              =tmp;
                      }
                  }
                  printf(
              "unsolvable\n");
                  
              return 0;
              }

            posted on 2008-09-20 04:18 infinity 閱讀(2219) 評論(0)  編輯 收藏 引用 所屬分類: acm
            久久久久久久精品成人热色戒| 亚洲天堂久久精品| 欧美亚洲国产精品久久| 久久精品桃花综合| 国产精品久久久久久久久| 久久93精品国产91久久综合| 久久国产精品波多野结衣AV| 亚洲伊人久久综合影院| 久久国产欧美日韩精品| 久久综合日本熟妇| 97久久精品人妻人人搡人人玩| 久久婷婷五月综合97色直播| 久久精品人人槡人妻人人玩AV| 久久久WWW成人| 国产精品久久久久久搜索| 久久只有这精品99| 国产精品久久久久一区二区三区| 久久99热这里只有精品国产| 国产精品丝袜久久久久久不卡| 亚洲va国产va天堂va久久| 少妇被又大又粗又爽毛片久久黑人| 久久久久久久久无码精品亚洲日韩 | 久久无码国产专区精品| 日韩一区二区久久久久久| 久久久国产打桩机| 一级女性全黄久久生活片免费| 免费观看久久精彩视频| 久久久久久无码Av成人影院| 无码超乳爆乳中文字幕久久| 合区精品久久久中文字幕一区| 国产L精品国产亚洲区久久| 狠狠久久亚洲欧美专区| 久久亚洲日韩精品一区二区三区| 2021久久精品免费观看| 一个色综合久久| 精品久久人人爽天天玩人人妻| 亚洲а∨天堂久久精品9966| 久久人搡人人玩人妻精品首页| 久久99精品免费一区二区| 精品久久久久久久中文字幕| 久久影院亚洲一区|