• 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
    ");
            }
            else
            {
                printf("%d
    ",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)
    ");
                    }
                    if(path[i]==2)
                    {
                        printf("FILL(2)
    ");
                    }
                    if(path[i]==3)
                    {
                        printf("DROP(1)
    ");
                    }
                    if(path[i]==4)
                    {
                        printf("DROP(2)
    ");
                    }
                    if(path[i]==5)
                    {
                        printf("POUR(1,2)
    ");
                    }
                    if(path[i]==6)
                    {
                        printf("POUR(2,1)
    ");
                    }
                }
            }
            
        }
        return 0;
    }
    View Code
  • 相关阅读:
    EF Code First一对一、一对多、多对多关联关系配置
    ASP.NET MVC 3.0 HTML辅助方法
    CSS常用命名
    ExtJS3.4.0系列:ExtJS下载使用
    在HTTP响应标题中隐藏ASP.NET MVC的版本
    ASP.NET MVC动作过滤器
    Sql Server系列:使用TransactSQL编程
    ExtJS3.4.0系列:Ext.Panel
    Sql Server系列:Select检索数据
    ASP.NET MVC资源文件多语言实现方式
  • 原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4526011.html
Copyright © 2020-2023  润新知