zoukankan      html  css  js  c++  java
  • hoj1195

    双向广度优先搜索,本来是想哪个节点少扩展哪个,但是有一个问题,就是有可能上端的x层节点扩展出x+1层,下端的y层扩展出y+1层,这两个+1层有重合,便直接跳出,输出x+y+1,这样可能导致错误,因为x层节点并没有完全扩展完毕,很可能接下来要扩展的x层节点会扩展出的x+1层节点直接与y层节点重合。

    View Code
    #include <iostream>
    #include
    <cstdio>
    #include
    <cstdlib>
    #include
    <cstring>
    #include
    <queue>
    using namespace std;

    struct Node
    {
    int lock[4];
    int depth;
    }s, e;

    int qnum[3], ans;
    int hash[3][10][10][10][10];

    void getin(int a[], char *st)
    {
    for (int i = 0; i < 4; i++)
    a[i]
    = st[i] - '0';
    }

    bool hashit(Node &a, int flag)
    {
    if (hash[flag][a.lock[0]][a.lock[1]][a.lock[2]][a.lock[3]] == -1)
    {
    hash[flag][a.
    lock[0]][a.lock[1]][a.lock[2]][a.lock[3]] = a.depth;
    if (hash[3 - flag][a.lock[0]][a.lock[1]][a.lock[2]][a.lock[3]] != -1)
    ans
    = a.depth + hash[3 - flag][a.lock[0]][a.lock[1]][a.lock[2]][a.lock[3]];
    return true;
    }
    return false;
    }

    void extend(queue <Node> &q, int flag)
    {
    qnum[flag]
    --;
    Node temp
    = q.front();
    //printf("%d %d %d %d %d\n", temp.depth, temp.lock[0], temp.lock[1], temp.lock[2], temp.lock[3]);
    q.pop();
    temp.depth
    ++;
    for (int i = 0; i < 3; i++)
    {
    swap(temp.
    lock[i], temp.lock[i + 1]);
    if (hashit(temp, flag))
    {
    q.push(temp);
    qnum[flag]
    ++;
    }
    swap(temp.
    lock[i], temp.lock[i + 1]);
    }
    for (int i = 0; i < 4; i++)
    {
    temp.
    lock[i]++;
    if (temp.lock[i] > 9)
    temp.
    lock[i] -= 9;
    if (hashit(temp, flag))
    {
    q.push(temp);
    qnum[flag]
    ++;
    }
    temp.
    lock[i]--;
    if (temp.lock[i] < 1)
    temp.
    lock[i] += 9;
    temp.
    lock[i]--;
    if (temp.lock[i] < 1)
    temp.
    lock[i] += 9;
    if (hashit(temp, flag))
    {
    q.push(temp);
    qnum[flag]
    ++;
    }
    temp.
    lock[i]++;
    if (temp.lock[i] > 9)
    temp.
    lock[i] -= 9;
    }
    }

    void work()
    {
    memset(hash,
    -1, sizeof(hash));
    qnum[
    2] = 1;
    qnum[
    1] = 1;
    queue
    <Node> q1, q2;
    q1.push(s);
    q2.push(e);
    hashit(s,
    1);
    hashit(e,
    2);
    int d1 = 0;
    int d2 = 0;
    while (!q1.empty() || !q2.empty())
    {
    if (qnum[1] < qnum[2] && qnum[1] != 0)
    {
    while (q1.front().depth == d1)
    extend(q1,
    1);
    d1
    = q1.front().depth;
    }
    else
    {
    while (q2.front().depth == d2)
    extend(q2,
    2);
    d2
    = q2.front().depth;
    }
    if (ans != -1)
    return;
    }
    }

    void input()
    {
    char st1[5], st2[5];
    ans
    = -1;
    scanf(
    "%s", st1);
    scanf(
    "%s", st2);
    if (strcmp(st1, st2) == 0)
    {
    ans
    = 0;
    return;
    }
    getin(s.
    lock, st1);
    getin(e.
    lock, st2);
    s.depth
    = 0;
    e.depth
    = 0;
    work();
    }

    int main()
    {
    //freopen("D:\\t.txt", "r", stdin);
    int t;
    scanf(
    "%d", &t);
    while (t--)
    {
    input();
    printf(
    "%d\n", ans);
    }
    return 0;
    }
  • 相关阅读:
    给定一个十进制数M,以及需要转换的进制数N。 将十进制数M转化为N进制数
    java计算两条线段交点
    输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m 转载
    全排列 (递归求解+字典序) java 转载
    四大线程池详解(转载)
    生产者消费者简单实现(转载)
    进程 线程通信方式(转载)
    匿名对象和类名为数据类型(java)
    星星(java)
    杨辉三角(java)
  • 原文地址:https://www.cnblogs.com/rainydays/p/1998511.html
Copyright © 2011-2022 走看看