bfs+路径记录(数组模拟队列实现)


/*带路径记录的bfs问题,用数组模拟队列,以此来记录数组下标,可以回溯路径**/


#include
#include

const int maxn = 110;
struct Pot
{
    int A, B, cost, op, pre;
}q[maxn*maxn];

int a, b, c;
bool vis[maxn][maxn];
int id[maxn*maxn];
int step;
int flag;
int fin;

void bfs()
{
    Pot s, e;
    int head, tail;
    head = tail = 0;
    q[tail].A = 0;
    q[tail].B = 0;
    q[tail].cost = 0;
    q[tail].op = 0;
    q[tail].pre = 0;
    tail++;
    memset(vis, false, sizeof(vis));
    vis[0][0] = true;
    while (head < tail)
    {
        s = q[head];
        head++;
        if (s.A == c || s.B == c)
        {
            flag = 1;
            step = s.cost;
            fin = head - 1;
        }
        for (int i = 1;i <= 6;i++)
        {
            if (i == 1)
            {
                e.A = a;
                e.B = s.B;
            }
            else if (i == 2)
            {
                e.A = s.A;
                e.B = b;
            }
            else if (i == 3)
            {
                e.A = 0;
                e.B = s.B;
            }
            else if (i == 4)
            {
                e.A = s.A;
                e.B = 0;
            }
            else if (i == 5)
            {
                if (s.A + s.B > b)
                {
                    e.A = s.A - b + s.B;
                    e.B = b;
                }
                else
                {
                    e.A = 0;
                    e.B = s.A + s.B;
                }
            }
            else if (i == 6)
            {
                if (s.A + s.B > a)
                {
                    e.B = s.B - a + s.A;
                    e.A = a;
                }
                else
                {
                    e.A = s.A + s.B;
                    e.B = 0;
                }
            }
            e.op = i;
            if(!vis[e.A][e.B])
            {
                vis[e.A][e.B] = true;
                e.cost = s.cost + 1;
                e.pre = head - 1;
                q[tail].A = e.A;
                q[tail].B = e.B;
                q[tail].cost = e.cost;
                q[tail].op = e.op;
                q[tail].pre = e.pre;
                tail++;
                if (e.A == c || e.B == c)
                {
                    flag = 1;
                    step = e.cost;
                    fin = tail - 1;
                    return;
                }
            }
        }
    }
}

int main()
{
    while (~scanf("%d %d %d", &a, &b, &c))
    {
        flag = 0;
        step = 0;
        bfs();
        if (flag)
        {
            printf("%d\n", step);
            id[step] = fin;
            for (int i = step - 1;i >= 1;i--)
            {
                id[i] = q[id[i + 1]].pre;
            }
            for (int i = 1;i <= step;i++)
            {
                if (q[id[i]].op == 1)
                    printf("FILL(1)\n");
                else if (q[id[i]].op == 2)
                    printf("FILL(2)\n");
                else if (q[id[i]].op == 3)
                    printf("DROP(1)\n");
                else if (q[id[i]].op == 4)
                    printf("DROP(2)\n");
                else if (q[id[i]].op == 5)
                    printf("POUR(1,2)\n");
                else if (q[id[i]].op == 6)
                    printf("POUR(2,1)\n");
            }
        }
        else
        {
            printf("impossible\n");
        }
    }
    return 0;
}



你可能感兴趣的:(ACM-搜索)