Pots--poj(bfs,输出路径)

http://poj.org/problem?id=3414

题意:

给你两个容量为a,b的杯子;有3个操作:

1:FILL(i);把第i个杯子从水库中装满;

2:DROP(i);把第i个杯子清空;

3:POUR(i,j);把第i个杯子的水移入到j中,直到第i个杯子空了或者第j个杯子满了为止;

分析:本题和上篇的差不多,多的就是输出路径;

包含六个过程:水池—>a; 水池—>b;a->水池;b->水池;a->b;b->a;

      |  prea

pre[x][y]  |  preb

      | op

第一个杯子的水量为x,第二个杯子水量为y它是由第一个水量为pre[x][y].prea、第二个水量为pre[x][y].preb经过操作op来变成的;

最后根据最终两个杯子中水的剩余量把路径倒着存入path中;

代码如下:

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
#define N 110
using namespace std;
struct node
{
    int a,b,step;
    friend bool operator< (node a,node b)
    {
        return a.step>b.step;
    }
};
struct NODE
{
    int prea,preb,op;
};
NODE pre[N][N];
int a,b,c,flag;
int vis[N][N];
node bfs()
{
    int i;
    priority_queue<node>Q;
    node p,q;
    p.a=p.b=0;
    p.step=0;
    pre[0][0].prea=pre[0][0].prea=pre[0][0].op=0;
    memset(vis,0,sizeof(vis));
    vis[0][0]=1;
    Q.push(p);
    while(!Q.empty())
    {
        q=Q.top();
        Q.pop();
        if(q.a==c||q.b==c)
        {
            flag=1;
            return q;
        }
        for(i=1;i<=6;i++)
        {
            if(i==1)//FILL(1);
            {
                p.a=a;
                p.b=q.b;
            }
            if(i==2)//FILL(2);
            {
                p.a=q.a;
                p.b=b;
            }
            if(i==3)//DROP(1)
            {
                p.a=0;
                p.b=q.b;
            }
            if(i==4)//DROP(2)
            {
                p.a=q.a;
                p.b=0;
            }
            if(i==5)//POUR(1,2)
            {
                if(b-q.b>=q.a)//a倒b中,a倒完了;
                {
                    p.a=0;
                    p.b=q.a+q.b;
                }
                else
                {
                    p.b=b;
                    p.a=q.a-(b-q.b);
                }
            }
            if(i==6)//POUR(2,1)
            {
                if(a-q.a>=q.b)//b倒a中,b倒完了;
                {
                    p.b=0;
                    p.a=q.a+q.b;
                }
                else
                {
                    p.a=a;
                    p.b=q.b-(a-q.a);
                }
            }
            if(vis[p.a][p.b]==0)
            {
                vis[p.a][p.b]=1;

                p.step=q.step+1;

                pre[p.a][p.b].prea=q.a;
                pre[p.a][p.b].preb=q.b;
                pre[p.a][p.b].op=i;

                Q.push(p);
            }
        }

    }

}

int main()
{
    node re;
    int path[N],i,x,y,step,x1;
    while(scanf("%d%d%d",&a,&b,&c)!=EOF)
    {
        memset(path,0,sizeof(path));
        flag=0;
        re=bfs();
        if(flag==0)
        {
            printf("impossible\n");
        }
        else
        {
            printf("%d\n",re.step);
            step=re.step;
            x=re.a;
            y=re.b;
            for(i=step;i>=1;i--)//把路径保存在path中;
            {
                path[i]=pre[x][y].op;
                x1=x;
                x=pre[x1][y].prea;//更新x,y;
                y=pre[x1][y].preb;
            }
            for(i=1;i<=re.step;i++)
            {
                if(path[i]==1)
                {
                    printf("FILL(1)\n");
                }
                if(path[i]==2)
                {
                    printf("FILL(2)\n");
                }
                if(path[i]==3)
                {
                    printf("DROP(1)\n");
                }
                if(path[i]==4)
                {
                    printf("DROP(2)\n");
                }
                if(path[i]==5)
                {
                    printf("POUR(1,2)\n");
                }
                if(path[i]==6)
                {
                    printf("POUR(2,1)\n");
                }
            }
        }

    }
    return 0;
}
时间: 2024-11-13 06:44:44

Pots--poj(bfs,输出路径)的相关文章

Ignatius and the Princess I (hdu 1026 优先队列+bfs+输出路径)

Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14624    Accepted Submission(s): 4634 Special Judge Problem Description The Princess has been abducted by the BEelzeb

poj 3414 Pots【bfs+回溯路径 正向输出】

题目地址:http://poj.org/problem?id=3414 Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12080   Accepted: 5104   Special Judge Description You are given two pots, having the volume of A and B liters respectively. The following operation

(简单) POJ 3414 Pots,BFS+记录路径。

Description You are given two pots, having the volume of A and B liters respectively. The following operations can be performed: FILL(i)        fill the pot i (1 ≤ i ≤ 2) from the tap; DROP(i)      empty the pot i to the drain; POUR(i,j)    pour from

蓝桥T291(BFS + 输出路径)

http://lx.lanqiao.org/problem.page?gpid=T291 学霸的迷宫 时间限制:1.0s   内存限制:256.0MB 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫.因为班长还有妹子要陪,磨刀不误砍柴功,他为了节约时间,从线人那里搞到了迷宫的地图,准备提前计算最短的路线.可是他现在正向妹子解释这件事情,于是就委托你帮他找一条最短的路线. 输

迷宫问题 (BFS ?输出路径)

题目链接:http://poj.org/problem?id=3984 思路: 这道题的难点我觉得主要是在记录路径上面. 我们不能去记录当前的步数的走的坐标(x,y) ,因为这样会被后面的覆盖. 所以我们记录的应该是前一步所走的 具体代码: 1 #include <iostream> 2 #include <string> 3 #include <cstring> 4 #include <queue> 5 #include <string.h>

(BFS 输出路径 pair)

迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 41913   Accepted: 23240 Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走

bfs输出路径 &amp;&amp; 最短路(迪杰斯特拉)输出路径

问题描述 解决方法 1.像第一个问题那就是最短路问题(我代码采用迪杰斯特拉算法)实现 2.换乘次数最少,那就用bfs广搜来寻找答案.但是我的代码不能保证这个最少换乘是最短路程 代码 1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 #include<queue> 6 #include<vector> 7 using

地下迷宫(bfs输出路径)

题解:开一个pre数组用编号代替当前位置,编号用结构题另存,其实也可以i*m+j来代替,我写的有点麻烦了; 代码: #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> #include <queue> using namespace std; #pragma(1) typedef struct No

poj3414 Pots(BFS+路径输出)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=3414 此题和poj1606一样 :http://blog.csdn.net/u012860063/article/details/37772275 Description You are given two pots, having the volume of A and B liters respectively.

(poj)3414 Pots (输出路径的广搜)

Description You are given two pots, having the volume of A and B liters respectively. The following operations can be performed: FILL(i) fill the pot i (1 ≤ i ≤ 2) from the tap; DROP(i) empty the pot i to the drain; POUR(i,j) pour from pot i to pot j