当前位置: 移动技术网 > IT编程>开发语言>C/C++ > 洛谷 P1432 倒水问题

洛谷 P1432 倒水问题

2019年07月06日  | 移动技术网IT编程  | 我要评论

盘古会,郭少芸老公,川并舞夏

目录


题目

思路

$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;
}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网