您的位置:首页 > 其它

hdu 1043 八数码 经典搜索问题 BFS+MAP

2013-05-28 10:57 351 查看

Eight

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 8747    Accepted Submission(s): 2387
Special Judge


[align=left]Problem Description[/align]
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.

 

[align=left]Input[/align]
You will receive, several descriptions of configuration of the 8 puzzle. One 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

 

[align=left]Output[/align]
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. Do not print a blank line between cases.

 

[align=left]Sample Input[/align]

2  3  4  1  5  x  7  6  8

 

[align=left]Sample Output[/align]

ullddrurdllurdruldr

 

[align=left]Source[/align]
South Central USA 1998 (Sepcial Judge Module By JGShining)

 

[align=left]Recommend[/align]
JGShining
思路:
用map存取走过的状态   总共有9!个状态
然后用123456780 倒推所有能走到终态的状态
注意
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};

char fx[] = {'d', 'u', 'r', 'l'};

 -1 0对应的方向是down
x减小 x是指横 那么应该是向上 应该是up
但是由于是倒推 输出也要逆序输出
因为要从终态123456780推出其它状态 所以输出要逆序输出 上就是下 下就是上 左就是右 右就是左

 
#include<stdio.h>

#include<string>

#include<queue>

#include<map>

using namespace std;

struct haha

{

     int pos;

     string path;

     string str;

     haha()

     {

         pos=0;

     }

}q,temp;

int dir[4][2]={1,0,-1,0,0,1,0,-1},pos;

string begin;

char fx[4]={'u','d','l','r'};

map<string,struct haha>mp;

void BFS()

{

    int i;

    queue<struct haha>que;

      q.path="";

      q.pos=pos;

      q.str=begin;

      string mid;

      mp[begin].pos=1;

  que.push(q);

      while(!que.empty())

      {

          temp=que.front();

          que.pop();

          for(i=0;i<4;i++)

          {

              int x=temp.pos/3+dir[i][0];

              int y=temp.pos%3+dir[i][1];

              if(x<0||x>2||y<0||y>2) continue;

              mid=temp.str;

              pos=temp.pos;//重

              if(i==0)

              {

                   mid[pos+3]=temp.str[pos];

                   mid[pos]=temp.str[pos+3];

                   q.pos=pos+3;

              }

              else if(i==1)

              {

                   mid[pos-3]=temp.str[pos];

                   mid[pos]=temp.str[pos-3];

                   q.pos =pos-3;//

              }

              else if(i==2)

              {

                  mid[pos+1]=temp.str[pos];

                  mid[pos]=temp.str[pos+1];

                  q.pos =pos+1;

              }

              else

              {

                  mid[pos-1]=temp.str[pos];

                  mid[pos]=temp.str[pos-1];

                  q.pos =pos-1;

              }

              if(mp[mid].pos==0)

              {

                  q.path=temp.path;

                                 q.path+=fx[i];

                                 q.str=mid;

                     mp[mid].path=q.path;

                     mp[mid].pos=1;

                                 que.push(q);

              }

          }

      }

}

int main()

{

    int i ,cnt=0;

    char s[2];

    begin="12345678x";

    pos=8;

    BFS();

    begin="";

    while(scanf("%s",s)!=EOF)

    {

         cnt++;

         begin+=s[0];

         if(cnt==9)

            {

                if(mp[begin].pos==0)

                    printf("unsolvable\n");

                else

                {

                      for(i=mp[begin].path.size()-1;i>=0;i--)

                         printf("%c",mp[begin].path[i]);

                         printf("\n");

                }

                begin="";cnt=0;

            }

    }

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: