三个水杯-简单bfs

来源:互联网 发布:如何在淘宝上开好网店 编辑:程序博客网 时间:2024/05/04 11:40

给你三个水杯的容量,只有第一杯里面装满水,其他两个水杯是空的,再输入三个目标值,问你是否能通过倒水达到这个目标,如果能,输入最少步数,如果不能,输出-1.

这题其实就是一个简单的BFS,以前感觉太麻烦了,一直不想写,今天终于AC了它。最后提示一下,BFS还是加上标记比较好。

#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<queue>using namespace std;int v1,v2,v3,e1,e2,e3;int book[100][100][100];typedef struct{    int a,b,c,s;}node;void bfs(){    queue<node> q;    node t;    t.a = v1;    t.b = 0;    t.c = 0;    t.s = 0;    q.push(t);    while(!q.empty())    {        if(q.front().a == e1 && q.front().b == e2 && q.front().c == e3)        {            printf("%d\n",q.front().s);            return;        }        if(q.front().a == v1 && q.front().b == v2 && q.front().c == 0 && q.front().s != 0)        {            printf("-1\n");            return;        }        t = q.front();        q.pop();        node n;        if(t.a && t.b < v2)//ab        {            if(t.a >= (v2 - t.b))            {                n.a = t.a - (v2 - t.b);                n.b = v2;            }            else            {                n.a = 0;                n.b = t.b + t.a;            }            n.c = t.c;            n.s = t.s + 1;            if(book[n.a][n.b][n.c]==0)            {                book[n.a][n.b][n.c]=1;                q.push(n);            }        }        if(t.a && t.c < v3)//ac        {            if(t.a >= (v3 - t.c))            {                n.a = t.a - (v3 - t.c);                n.c = v3;            }            else            {                n.a = 0;                n.c = t.c + t.a;            }            n.b = t.b;            n.s = t.s + 1;            if(book[n.a][n.b][n.c]==0)            {                book[n.a][n.b][n.c]=1;                q.push(n);            }        }        if(t.b && t.a < v1)//ba        {            if(t.b >= (v1 - t.a))            {                n.b = t.b - (v1 - t.a);                n.a = v1;            }            else            {                n.b = 0;                n.a = t.a + t.b;            }            n.c = t.c;            n.s = t.s + 1;            if(book[n.a][n.b][n.c]==0)            {                book[n.a][n.b][n.c]=1;                q.push(n);            }        }        if(t.b && t.c < v3)//bc        {            if(t.b >= (v3 - t.c))            {                n.b = t.b - (v3 - t.c);                n.c = v3;            }            else            {                n.b = 0;                n.c = t.c + t.b;            }            n.a = t.a;            n.s = t.s + 1;            if(book[n.a][n.b][n.c]==0)            {                book[n.a][n.b][n.c]=1;                q.push(n);            }        }        if(t.c && t.a < v1)//ca        {            if(t.c >= (v1 - t.a))            {                n.c = t.c - (v1 - t.a);                n.a = v1;            }            else            {                n.c = 0;                n.a = t.a + t.c;            }            n.b = t.b;            n.s = t.s + 1;            if(book[n.a][n.b][n.c]==0)            {                book[n.a][n.b][n.c]=1;                q.push(n);            }        }        if(t.c && t.b < v2)//cb        {            if(t.c >= (v2 - t.b))            {                n.c = t.c - (v2 - t.b);                n.b = v2;            }            else            {                n.c = 0;                n.b = t.b + t.c;            }            n.a = t.a;            n.s = t.s + 1;            if(book[n.a][n.b][n.c]==0)            {                book[n.a][n.b][n.c]=1;                q.push(n);            }        }    }    printf("-1\n");}int main(void){    int T;    scanf("%d",&T);    while(T--)    {        memset(book,0,sizeof(book));        scanf("%d%d%d",&v1,&v2,&v3);        scanf("%d%d%d",&e1,&e2,&e3);        bfs();    }    return 0;}/*26 3 14 1 19 3 27 1 1*/


0 0