POJ 1077 Eight

Eight
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 30944 Accepted: 13453 Special Judge


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:

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


解析:八数码问题,[康托展开](http://www.cnblogs.com/inmoonlight/p/6095121.html)+BFS。
``` #include #include #include #include using namespace std;

struct Node{
int s[9];
int loc;
int status;
string path;
};

int f[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 326800};
const int MAXN = 1000000;
bool vis[MAXN];
int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
char indexs[5] = "udlr";
int aim_status = 46234;

int cantor(int s[], int n)
{
int ret = 0;
for(int i = 0; i < n; ++i){
int cnt = 0;
for(int j = i+1; j < n; ++j){
if(s[j] < s[i])
++cnt;
}
ret += cnt*f[n-1-i];
}
return ret+1;
}

void bfs(Node cur)
{
if(cur.status == aim_status){
cout<<cur.path<<endl;
return;
}
memset(vis, 0, sizeof vis);
vis[cur.status] = true;
queue q;
q.push(cur);
while(!q.empty()){
cur = q.front(); q.pop();
int x = cur.loc/3, y = cur.loc%3;
for(int i = 0; i < 4; ++i){
int tx = x+dir[i][0], ty = y+dir[i][1];
if(tx<0 || tx>2 || ty<0 || ty>2) continue;
Node next = cur;
next.loc = tx*3+ty;
next.s[cur.loc] = next.s[next.loc];
next.s[next.loc] = 0;
next.status = cantor(next.s, 9);
if(!vis[next.status]){
vis[next.status] = true;
next.path = next.path+indexs[i];
if(next.status == aim_status){
cout<<next.path<<endl;
return;
}
q.push(next);
}
}
}
cout<<"unsolvable"<<endl;
}

int main()
{
char ch;
Node node;
for(int i = 0; i < 9; ++i){
cin>>ch;
if(ch == 'x'){
node.s[i] = 0;
node.loc = i;
}
else node.s[i] = ch-'0';
}
node.status = cantor(node.s, 9);
bfs(node);
return 0;
}

posted on 2016-11-09 17:37  月夜下  阅读(75)  评论(0编辑  收藏  举报

导航

"320px">