zoukankan      html  css  js  c++  java
  • 洛谷 P1432 倒水问题

    题目

    思路

    (bfs)
    第一遍提交(50),第二遍就(100)了,qwq

    (Code)

    #include<iostream>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    int t,ca,cb,n,step,sum;
    int a_now[100001],b_now[100001],flag[100001];//a_now、b_now分别记录a、b壶中的水,flag判断当前这一步是从哪里扩展来的
    int ans[100001],qwq[100001];//ans存储进行了哪一步操作,qwq是最后的答案
    bool vis[1001][1001];//判断是否到达过当前情况
    inline int read(){
        int x=0;bool f=0;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return f?-x:x;
    }//读优
    inline void write(int x){
    	if(x<0) putchar('-'),write(-x);
    	else {if(x/10)write(x/10);putchar(x%10+'0');}
    }//输出
    void js(int x){
        if(flag[x]){
            js(flag[x]),step++;
            qwq[++sum]=ans[x];
        }
        return;
    }//计算用了几步以及分别是那几步
    void bfs(int a,int b){
        int head=0,tail=1;
        flag[tail]=0;
        a_now[tail]=a;
        b_now[tail]=b;
        vis[a][b]=1;
        while(head<tail){
            head++;
            for(register int i=1;i<=6;++i){
                if(i==1){
                    int c=ca,d=b_now[head];
                    if(!vis[c][d]){
                        vis[c][d]=1;
                        tail++,ans[tail]=i;
                        a_now[tail]=c,b_now[tail]=d;
                        flag[tail]=head;
                        if(d==n){js(tail);return;}
                    }
                }//1操作:fillA 意为给A灌满水
                if(i==2){
                    int c=a_now[head],d=cb;
                    if(!vis[c][d]){
                        vis[c][d]=1;
                        tail++,ans[tail]=i;
                        a_now[tail]=c,b_now[tail]=d;
                        flag[tail]=head;
                        if(d==n){js(tail);return;}
                    }
                }//2操作:fill B
                if(i==3){
                    int c=0,d=b_now[head];
                    if(!vis[c][d]){
                        vis[c][d]=1;
                        tail++,ans[tail]=i;
                        a_now[tail]=c,b_now[tail]=d;
                        flag[tail]=head;
                        if(d==n){js(tail);return;}
                    }
                }//3操作:empty A 意为将A中水倒空
                if(i==4){
                    int c=a_now[head],d=0;
                    if(!vis[c][d]){
                        vis[c][d]=1;
                        tail++,ans[tail]=i;
                        a_now[tail]=c,b_now[tail]=d;
                        flag[tail]=head;
                        if(d==n){js(tail);return;}
                    }
                }//4操作:empty B
                if(i==5){
                    int c,d,cha=ca-a_now[head];
                    if(cha>=b_now[head]) d=0,c=a_now[head]+b_now[head];
                    else c=ca,d=b_now[head]-cha;
                    if(!vis[c][d]){
                        vis[c][d]=1;
                        tail++,ans[tail]=i;
                        a_now[tail]=c,b_now[tail]=d;
                        flag[tail]=head;
                        if(d==n){
                            js(tail);
                            return;
                        }
                    }
                }//5操作:pour BA 意为将B中水倒到A中(直到A满或者B中水没有剩余)
                if(i==6){
                    int c,d;
                    int cha=cb-b_now[head];
                    if(cha>=a_now[head]) c=0,d=b_now[head]+a_now[head];
                    else c=a_now[head]-cha,d=cb;
                    if(!vis[c][d]){
                        vis[c][d]=1;
                        tail++,ans[tail]=i;
                        a_now[tail]=c;
                        b_now[tail]=d;
                        flag[tail]=head;
                        if(d==n){
                            js(tail);
                            return;
                        }
                    }
                }//6操作:pour A B
            }
        }
    }
    int main(){
        t=read();
        while(t--){
            ca=read(),cb=read(),n=read();
            bfs(0,0);//搜索
            printf("%d ",step);//输出有几步
            for(register int i=1;i<=step;++i){//输出答案
                write(qwq[i]);
                printf(" ");
                //printf("%d ",qwq[i]);
            }
            puts("");//换行
            step=sum=0;
            memset(vis,0,sizeof(vis));//初始化
        }
        return 0;
    }
    
  • 相关阅读:
    唤醒控件曾经拥有的能力(重新继承是可以使用的.)
    为ASP.NET MVC应用程序创建更复杂的数据模型
    Akka入门实例
    最火的.NET开源项目(转)
    Roslyn 编译平台概述
    C#开发157
    ASP.NET MVC学习之控制器篇
    AngularJS中数据双向绑定(two-way data-binding)
    订单系统中并发问题和锁机制的探讨
    Visual Studio 编辑器
  • 原文地址:https://www.cnblogs.com/poi-bolg-poi/p/11140502.html
Copyright © 2011-2022 走看看