zoukankan      html  css  js  c++  java
  • poj3414(bfs)

    题目链接:http://poj.org/problem?id=3414

    题意:给你两个容器 A  B 问是否能够经过有限的步骤倒水,得到容量为 C 的水,输出最小的步数,同时输出每一步的操作。如果不能达到目标状态,则输出  impossible。

    分析:这题跟hdu1495一样,需要分情况考虑,不过这里回溯输出路径。。。

    具体分析情况看这里:http://www.tuicool.com/articles/fqeI3i

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <cstdlib>
    #include <stack>
    #include <vector>
    #include <set>
    #include <map>
    #define LL long long
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    #define N 100010
    using namespace std;
    int a,b,c;
    int ok,vis[110][110];
    struct node
    {
        int x,y;
        int step;
    };
    struct point
    {
        int x,y,op;
    }pre[110][110];
    node make_node(int a,int b,int c)
    {
        node temp;
        temp.x=a;temp.y=b;temp.step=c;
        return temp;
    }
    void path(int x,int y)
    {
        if(x+y==0)
        {
            return ;
        }
        path(pre[x][y].x,pre[x][y].y);
        if(pre[x][y].op==1)
        {
            printf("FILL(1)
    ");
            return;
        }
        if(pre[x][y].op==2)
        {
            printf("FILL(2)
    ");
            return;
        }
        if(pre[x][y].op==3)
        {
            printf("DROP(1)
    ");
            return;
        }
        if(pre[x][y].op==4)
        {
            printf("DROP(2)
    ");
            return;
        }
        if(pre[x][y].op==5)
        {
            printf("POUR(2,1)
    ");
            return;
        }
        if(pre[x][y].op==6)
        {
            printf("POUR(1,2)
    ");
            return;
        }
    }
    void bfs()
    {
        queue<node>que;
        while(!que.empty())que.pop();
        memset(vis,0,sizeof(vis));
        memset(pre,0,sizeof(pre));
        node cur,nxt;
        vis[0][0]=1;
        que.push(make_node(0,0,0));
        while(!que.empty())
        {
            cur=que.front();que.pop();
            if(cur.x==c||cur.y==c)
            {
                printf("%d
    ",cur.step);
                path(cur.x,cur.y);ok=1;
                return;
            }//printf("%d %d
    ",cur.x,cur.y);
            if(!vis[a][cur.y])
            {
                vis[a][cur.y]=1;
                pre[a][cur.y].x=cur.x;
                pre[a][cur.y].y=cur.y;
                pre[a][cur.y].op=1;
                que.push(make_node(a,cur.y,cur.step+1));
            }
            if(!vis[cur.x][b])
            {
                vis[cur.x][b]=1;
                pre[cur.x][b].x=cur.x;
                pre[cur.x][b].y=cur.y;
                pre[cur.x][b].op=2;
                que.push(make_node(cur.x,b,cur.step+1));
            }
            if(!vis[0][cur.y])
            {
                vis[0][cur.y]=1;
                pre[0][cur.y].x=cur.x;
                pre[0][cur.y].y=cur.y;
                pre[0][cur.y].op=3;
                que.push(make_node(0,cur.y,cur.step+1));
            }
            if(!vis[cur.x][0])
            {
                vis[cur.x][0]=1;
                pre[cur.x][0].x=cur.x;
                pre[cur.x][0].y=cur.y;
                pre[cur.x][0].op=4;
                que.push(make_node(cur.x,0,cur.step+1));
            }
            if(cur.x+cur.y<=a)
            {
                int xx=cur.x+cur.y,yy=0;
                if(!vis[xx][yy])
                {
                    vis[xx][yy]=1;
                    pre[xx][yy].x=cur.x;
                    pre[xx][yy].y=cur.y;
                    pre[xx][yy].op=5;
                    que.push(make_node(xx,yy,cur.step+1));
                }
            }
            else
            {
                int xx=a,yy=cur.x+cur.y-a;
                if(!vis[xx][yy])
                {
                    vis[xx][yy]=1;
                    pre[xx][yy].x=cur.x;
                    pre[xx][yy].y=cur.y;
                    pre[xx][yy].op=5;
                    que.push(make_node(xx,yy,cur.step+1));
                }
            }
            if(cur.x+cur.y<=b)
            {
                int xx=0,yy=cur.x+cur.y;
                if(!vis[xx][yy])
                {
                    vis[xx][yy]=1;
                    pre[xx][yy].x=cur.x;
                    pre[xx][yy].y=cur.y;
                    pre[xx][yy].op=6;
                    que.push(make_node(xx,yy,cur.step+1));
                }
            }
            else
            {
                int xx=cur.x+cur.y-b,yy=b;
                if(!vis[xx][yy])
                {
                    vis[xx][yy]=1;
                    pre[xx][yy].x=cur.x;
                    pre[xx][yy].y=cur.y;
                    pre[xx][yy].op=6;
                    que.push(make_node(xx,yy,cur.step+1));
                }
            }
        }
    }
    int main()
    {
        while(scanf("%d%d%d",&a,&b,&c)>0)
        {
            ok=0;
            bfs();
            if(ok==0)puts("impossible");
        }
    }
    View Code
  • 相关阅读:
    BZOJ 3881: [Coci2015]Divljak
    BZOJ 2434: [Noi2011]阿狸的打字机
    BZOJ 2580: [Usaco2012 Jan]Video Game
    BZOJ 3940: [Usaco2015 Feb]Censoring
    BZOJ 3942: [Usaco2015 Feb]Censoring
    PTA L2-002 链表去重 团体程序设计天梯赛-练习集
    PTA L2-001 紧急救援-最短路(Dijkstra)多条最短路找最优解并输出路径 团体程序设计天梯赛-练习集
    PTA L1-020 帅到没朋友 团体程序设计天梯赛-练习集
    Codeforces 429 B. Working out-dp( Codeforces Round #245 (Div. 1))
    HDU 6467.简单数学题-数学题 (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)
  • 原文地址:https://www.cnblogs.com/lienus/p/4173013.html
Copyright © 2011-2022 走看看