BFS模版题----水缸灌水(c++)

先挂题目:

水缸灌水

题目描述

有两个无刻度标志的水壶,分别可装x升和y升(x,y为整数,xy<=100)的水。设另一方面有一水缸,可用来向水壶灌水或倒出水,两水壶间,水也可以相互倾灌。已知x升为满壶,y升为空壶。问如何通过倒水或灌水操作用最少步数能在y升壶中量出zz<=100)升的水来。

输入

一行:x,y,z

输出

每一行为一个步骤,输出步骤数和xy水壶里面的水(输出时注意:本着节约用水的原则,因此,优先两个水壶互相倒水,无法达到目的时,再考虑,将水浪费掉)

格式控制符为:sep%3d:%5d%5d

如果无解则输出

No answer

样例输入

8 5 3

样例输出

sep0: 8 0

sep1: 3 5

sep2: 3 0

sep3: 0 3

 这道题与一般的水缸灌水有一定区别,一般的水缸灌水只需要输出需要的最小步数而这道题需要输出每一步的水壶中的水量并且要节约用水(我做的时候被坑得要死)。

 根据题意我们可以看出一共有六种情况:

1a壶倒空,2b壶倒空,3a壶倒满,4b壶倒满

5、a壶倒入b壶中(1b壶倒满,a壶没有剩余(2b壶倒满,a壶有剩余

 6b壶倒入a壶中(1a壶倒满,b壶没有剩余(2a壶倒满,b壶有剩余

 通过这六种情况可以建立一个函数,把这六步遍历一遍即可。

代码如下:

#include
#include
struct cup{
    int x;
    int y;
    int step;
    int upa,upb;
};
int a,b,z,tail=2;
bool f[110][110],s[110][110];
cup q[1010];
void water(cup in){
    if(f[in.x][in.y]) return ;
    f[in.x][in.y]=1; 
    cup p=in;
    if(in.x+in.y<=b){           //a桶倒入b桶中,能否倒满
        p.y=in.x+in.y;
        p.x=0;
        if(s[p.x][p.y]==0){
            q[tail]=p;
            q[tail].step++;
            q[tail].upa=in.x;
            q[tail].upb=in.y;
            tail++;
            s[p.x][p.y]=1;
        }
    }
    else {
        p.y=b;
        p.x=in.x+in.y-b;
        if(s[p.x][p.y]==0){
            q[tail]=p;
            q[tail].step++;
            q[tail].upa=in.x;
            q[tail].upb=in.y;
            tail++;
            s[p.x][p.y]=1;
        }
    }
    p=in;
    if(in.x+in.y<=a){          //b桶倒入a桶中,能否倒满
        p.x=in.x+in.y;
        p.y=0;
        if(s[p.x][p.y]==0){
            q[tail]=p;
            q[tail].step++;
            q[tail].upa=in.x;
            q[tail].upb=in.y;
            tail++;
            s[p.x][p.y]=1;
        }
    }   
    else {
        p.x=a;
        p.y=in.x+in.y-a;
        if(s[p.x][p.y]==0){
            q[tail]=p;
            q[tail].step++;
            q[tail].upa=in.x;
            q[tail].upb=in.y;
            tail++;
            s[p.x][p.y]=1;
        }
    }
    p=in;
    p.x=0;                     //a桶倒空 
    if(s[p.x][p.y]==0){
        q[tail]=p;
        q[tail].step++;
        q[tail].upa=in.x;
        q[tail].upb=in.y;
        tail++;
        s[p.x][p.y]=1;
    }
    p=in;
    p.y=0;                     //b桶倒空 
    if(s[p.x][p.y]==0){
        q[tail]=p;
        q[tail].step++;
        q[tail].upa=in.x;
        q[tail].upb=in.y;
        tail++;
        s[p.x][p.y]=1;
    }
    p=in;
    p.x=a;                     //a桶倒满 
    if(s[p.x][p.y]==0){
        q[tail]=p;
        q[tail].step++;
        q[tail].upa=in.x;
        q[tail].upb=in.y;
        tail++;
        s[p.x][p.y]=1;
    }
    p=in;
    p.y=b;                     //b桶倒满 
    if(s[p.x][p.y]==0){
        q[tail]=p;
        q[tail].step++;
        q[tail].upa=in.x;
        q[tail].upb=in.y;
        tail++;
        s[p.x][p.y]=1;
    }
}
void bfs2(int za,int zb){
    int k=1;
    if(q[k].x==za&&q[k].y==zb){
            printf("sep%3d:%5d%5d\n",q[k].step,q[k].x,q[k].y);
            return ;
        }
    while(k

注意:

1.六步操作遍历时有先后顺序,仔细思考!

2.可用queue替代数组,代码可变精简。





你可能感兴趣的:(BFS)