• <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
            久久久精品国产亚洲成人满18免费网站| 久久人妻无码中文字幕| 7777久久亚洲中文字幕| 九九99精品久久久久久| 欧美国产成人久久精品| 亚洲欧美日韩中文久久| 999久久久免费国产精品播放| 亚洲伊人久久综合中文成人网| 久久男人Av资源网站无码软件 | 久久天天躁狠狠躁夜夜avapp | 国产精品伊人久久伊人电影| 久久久青草青青国产亚洲免观| 亚洲AV无码久久精品蜜桃| 国产午夜精品久久久久九九电影 | 久久久久久精品成人免费图片| 国产日产久久高清欧美一区| 一个色综合久久| 91久久精品电影| 久久777国产线看观看精品| 麻豆久久久9性大片| 国内精品伊人久久久久网站| 久久久久免费看成人影片| 亚洲日本va午夜中文字幕久久| 国产精品一久久香蕉产线看| 无码久久精品国产亚洲Av影片| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 久久国产精品一区| 免费观看成人久久网免费观看| 亚洲乱码精品久久久久..| 久久久久久久久久久| 久久笫一福利免费导航 | 麻豆精品久久久久久久99蜜桃| 国产精品午夜久久| 久久久国产精品| 久久精品成人一区二区三区| 国产精品va久久久久久久| 久久精品国产99国产精品澳门 | 99久久无码一区人妻a黑| 久久久久久午夜成人影院| 国产精品免费看久久久| 高清免费久久午夜精品|