hdu1495非常可乐(BFS)

来源:互联网 发布:景观设计软件有哪些 编辑:程序博客网 时间:2024/06/09 15:49

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495


第一次做这种搜索,看了别人了博客,说是6种状态,没想到BFS还可以这么用。^_^


代码:


#include <cstdio>#include <cstring>#include <queue>using namespace std;const int maxn = 105;int a,b,c;struct node{    int a,b,c;    int s;};int v[maxn][maxn][maxn];void bfs(){    memset(v,0,sizeof(v));    queue<node> q;    node f,t;    f.a = a;    f.b = 0;    f.c = 0;    f.s = 0;    q.push(f);    while(!q.empty())    {        node h = q.front();        q.pop();        if((h.a == a / 2 && h.b == a / 2) ||(h.a == a / 2 && h.c == a / 2) || (h.b == a / 2 && h.c == a / 2))        {            printf("%d\n",h.s);            return ;        }        if(h.a)        {            if(h.a >= b - h.b)            {                t.a = h.a - (b - h.b);                t.b = b;                t.c = h.c;                t.s = h.s + 1;            }            else            {                t.a = 0;                t.b = h.a + h.b;                t.c = h.c;                t.s = h.s + 1;            }            if(!v[t.a][t.b][t.c])            {                q.push(t);                v[t.a][t.b][t.c] = 1;            }        }        if(h.a)        {            if(h.a >= c - h.c)            {                t.a = h.a - (c - h.c);                t.b = h.b;                t.c = c;                t.s = h.s + 1;            }            else            {                t.a = 0;                t.b = h.b;                t.c = h.c + h.a;                t.s = h.s + 1;            }            if(!v[t.a][t.b][t.c])            {                q.push(t);                v[t.a][t.b][t.c] = 1;            }        }        if(h.b)        {            if(h.b >= a - h.a)            {                t.a = a;                t.b = h.b - (a - h.a);                t.c = h.c;                t.s = h.s + 1;            }            else            {                t.a = h.a + h.b;                t.b = 0;                t.c = h.c;                t.s = h.s + 1;            }            if(!v[t.a][t.b][t.c])            {                q.push(t);                v[t.a][t.b][t.c] = 1;            }        }        if(h.b)        {            if(h.b >= c - h.c)            {                t.a = h.a;                t.b = h.b - (c - h.c);                t.c = c;                t.s = h.s + 1;            }            else            {                t.a = h.a;                t.b = 0;                t.c = h.c + h.b;                t.s = h.s + 1;            }            if(!v[t.a][t.b][t.c])            {                q.push(t);                v[t.a][t.b][t.c] = 1;            }        }        if(h.c)        {            if(h.c >= a - h.a)            {                t.a = a;                t.b = h.b;                t.c = h.c - (a - h.a);                t.s = h.s + 1;            }            else            {                t.a = h.a + h.c;                t.b = h.b;                t.c = 0;                t.s = h.s + 1;            }            if(!v[t.a][t.b][t.c])            {                q.push(t);                v[t.a][t.b][t.c] = 1;            }        }        if(h.c)        {            if(h.c >= b - h.b)            {                t.a = h.a;                t.b = b;                t.c = h.c - (b - h.b);                t.s = h.s + 1;            }            else            {                t.a = h.a;                t.b = h.b + h.c;                t.c = 0;                t.s = h.s + 1;            }            if(!v[t.a][t.b][t.c])            {                q.push(t);                v[t.a][t.b][t.c] = 1;            }        }    }    printf("NO\n");    return ;}int main(){    while(~scanf("%d%d%d",&a,&b,&c),a + b + c)    {        if(a & 1)            printf("NO\n");        else            bfs();    }}

0 0