zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    详解机器学习中的熵、条件熵、相对熵、交叉熵
    使用Keras进行深度学习:(三)使用text-CNN处理自然语言(上)
    粒子群优化算法(PSO)之基于离散化的特征选择(FS)(一)
    DNN模型训练词向量原理
    TensorFlow 实战卷积神经网络之 LeNet
    五大经典卷积神经网络介绍:LeNet / AlexNet / GoogLeNet / VGGNet/ ResNet
    Oracle 查询版本号
    C# 递归获取 文件夹的 所有文件
    SQL Server 常用语句
    Oracle 导入大量数据
  • 原文地址:https://www.cnblogs.com/inmoonlight/p/6047804.html
Copyright © 2011-2022 走看看