hud-1495--非常可乐 VS nyoj-21--三个水杯

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

nyoj--题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=21

hdu-1495---非常可乐

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int vis[105][105][105];
struct node
{
    int x,y,z,step;
};
void bfs(int S,int N,int M)
{
    node p,q;
    queue<node> Q;
    p.x=S;p.y=0;p.z=0;
    p.step=0;
    int pp=S/2;
    Q.push(p);
    while(!Q.empty())
    {
        q=Q.front();Q.pop();vis[q.x][q.y][q.z]=1;
        if((q.x==pp&&q.y==pp)||(q.x==pp&&q.z==pp)||(q.z==pp&&q.y==pp))
        {
            printf("%d\n",q.step);return;
        }
        if(q.x!=0)
        {
            //x->y
            if(q.x>N-q.y)//倒不完
            {
                p.x=q.x-(N-q.y);
                p.y=N;
                p.z=q.z;
                p.step=q.step+1;
            }
            else//倒完
            {
                p.x=0;
                p.y=q.x+q.y;
                p.z=q.z;
                p.step=q.step+1;
            }
            if(!vis[p.x][p.y][p.z])
            {
                Q.push(p);
                vis[p.x][p.y][p.z]=1;
            }
            //x->z
            if(q.x>M-q.z)//倒不完
            {
                p.x=q.x-(M-q.z);
                p.y=q.y;
                p.z=M;
                p.step=q.step+1;
            }
            else//倒完
            {
                p.x=0;
                p.z=q.x+q.z;
                p.y=q.y;
                p.step=q.step+1;
            }
            if(!vis[p.x][p.y][p.z])
            {
                Q.push(p);
                vis[p.x][p.y][p.z]=1;
            }
        }
        if(q.y!=0)
        {
            //y->x
            if(q.y>S-q.x)//倒不完
            {
                p.y=q.y-(S-q.x);
                p.x=S;
                p.z=q.z;
                p.step=q.step+1;
            }
            else//倒完
            {
                p.y=0;
                p.x=q.y+q.x;
                p.z=q.z;
                p.step=q.step+1;
            }
            if(!vis[p.x][p.y][p.z])
            {
                Q.push(p);
                vis[p.x][p.y][p.z]=1;
            }
            //y->z
            if(q.y>M-q.z)//倒不完
            {
                p.y=q.y-(M-q.z);
                p.x=q.x;
                p.z=M;
                p.step=q.step+1;
            }
            else//倒完
            {
                p.y=0;
                p.x=q.x;
                p.z=q.y+q.z;
                p.step=q.step+1;
            }
            if(!vis[p.x][p.y][p.z])
            {
                Q.push(p);
                vis[p.x][p.y][p.z]=1;
            }
        }
        if(q.z!=0)
        {
            //z->y
            if(q.z>N-q.y)//倒不完
            {
                p.z=q.z-(N-q.y);
                p.y=N;
                p.x=q.x;
                p.step=q.step+1;
            }
            else//倒完
            {
                p.z=0;
                p.y=q.z+q.y;
                p.x=q.x;
                p.step=q.step+1;
            }
            if(!vis[p.x][p.y][p.z])
            {
                Q.push(p);
                vis[p.x][p.y][p.z]=1;
            }
            //z->x
            if(q.z>S-q.x)//倒不完
            {
                p.z=q.z-(S-q.x);
                p.y=q.y;
                p.x=S;
                p.step=q.step+1;
            }
            else//倒完
            {
                p.z=0;
                p.y=q.y;
                p.x=q.z+q.x;
                p.step=q.step+1;
            }
            if(!vis[p.x][p.y][p.z])
            {
                Q.push(p);
                vis[p.x][p.y][p.z]=1;
            }
        }
    }
    printf("NO\n");
    return;
}
int main()
{
    int N,M,S;
    while(scanf("%d%d%d",&S,&N,&M),S,N,M)
    {
        memset(vis,0,sizeof(vis));
        if(S%2) printf("NO\n");
        else bfs(S,N,M);
    }
}

nyoj---21--三个水杯


#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int vis[105][105][105];
struct node
{
    int x,y,z,step;
};
int N,M,S,a,b,c;
int bfs()
{
    node p,q;
    queue<node> Q;
    memset(vis,0,sizeof(vis));
    p.x=S;
    p.y=0;
    p.z=0;
    p.step=0;
    Q.push(p);
    while(!Q.empty())
    {
        q=Q.front();Q.pop();
        vis[q.x][q.y][q.z]=1;
        if(q.x==a&&q.y==b&&q.z==c)
        {
            return q.step;
        }
        if(q.x!=0)
        {
            //x->y
            if(q.x>N-q.y)//倒不完
            {
                p.x=q.x-(N-q.y);
                p.y=N;
                p.z=q.z;
                p.step=q.step+1;
            }
            else//倒完
            {
                p.x=0;
                p.y=q.x+q.y;
                p.z=q.z;
                p.step=q.step+1;
            }
            if(!vis[p.x][p.y][p.z])
            {
                Q.push(p);
                vis[p.x][p.y][p.z]=1;
            }
            //x->z
            if(q.x>M-q.z)//倒不完
            {
                p.x=q.x-(M-q.z);
                p.y=q.y;
                p.z=M;
                p.step=q.step+1;
            }
            else//倒完
            {
                p.x=0;
                p.z=q.x+q.z;
                p.y=q.y;
                p.step=q.step+1;
            }
            if(!vis[p.x][p.y][p.z])
            {
                Q.push(p);
                vis[p.x][p.y][p.z]=1;
            }
        }
        if(q.y!=0)
        {
            //y->x
            if(q.y>S-q.x)//倒不完
            {
                p.y=q.y-(S-q.x);
                p.x=S;
                p.z=q.z;
                p.step=q.step+1;
            }
            else//倒完
            {
                p.y=0;
                p.x=q.y+q.x;
                p.z=q.z;
                p.step=q.step+1;
            }
            if(!vis[p.x][p.y][p.z])
            {
                Q.push(p);
                vis[p.x][p.y][p.z]=1;
            }
            //y->z
            if(q.y>M-q.z)//倒不完
            {
                p.y=q.y-(M-q.z);
                p.x=q.x;
                p.z=M;
                p.step=q.step+1;
            }
            else//倒完
            {
                p.y=0;
                p.x=q.x;
                p.z=q.y+q.z;
                p.step=q.step+1;
            }
            if(!vis[p.x][p.y][p.z])
            {
                Q.push(p);
                vis[p.x][p.y][p.z]=1;
            }
        }
        if(q.z!=0)
        {
            //z->y
            if(q.z>N-q.y)//倒不完
            {
                p.z=q.z-(N-q.y);
                p.y=N;
                p.x=q.x;
                p.step=q.step+1;
            }
            else//倒完
            {
                p.z=0;
                p.y=q.z+q.y;
                p.x=q.x;
                p.step=q.step+1;
            }
            if(!vis[p.x][p.y][p.z])
            {
                Q.push(p);
                vis[p.x][p.y][p.z]=1;
            }
            //z->x
            if(q.z>S-q.x)//倒不完
            {
                p.z=q.z-(S-q.x);
                p.y=q.y;
                p.x=S;
                p.step=q.step+1;
            }
            else//倒完
            {
                p.z=0;
                p.y=q.y;
                p.x=q.z+q.x;
                p.step=q.step+1;
            }
            if(!vis[p.x][p.y][p.z])
            {
                Q.push(p);
                vis[p.x][p.y][p.z]=1;
            }
        }
    }
    return -1;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d%d%d%d",&S,&N,&M,&a,&b,&c);
        printf("%d\n",bfs());
    }
}
/*45
6 3 1
6 0 0
84 62 13
51 20 13
71 54 47
17 7 47
85 48 23
15 48 22
84 68 19
44 21 19
75 46 3
65 7 3
70 57 20
6 44 20
49 31 15
6 31 12
88 53 32
16 53 19
56 31 18
29 9 18
96 56 43
25 28 43
93 83 48
0 45 48
60 27 14
23 27 10
70 60 9
10 51 9
82 34 12
66 4 12
87 64 51
13 64 10
66 48 14
62 0 4
86 74 21
43 22 21
99 47 23
85 0 14
68 29 3
62 3 3
54 53 1
10 43 1
95 79 75
91 0 4
84 7 5
72 7 5
84 62 13
51 20 13
71 54 47
17 7 47
85 48 23
15 48 22
84 68 19
44 21 19
75 46 3
65 7 3
70 57 20
6 44 20
49 31 15
6 31 12
88 53 32
16 53 19
56 31 18
29 9 18
96 56 43
25 28 43
93 83 48
0 45 48
60 27 14
23 27 10
70 60 9
10 51 9
82 34 12
66 4 12
87 64 51
13 64 10
66 48 14
62 0 4
86 74 21
43 22 21
99 47 23
85 0 14
68 29 3
62 3 3
54 53 1
10 43 1
95 79 75
91 0 4
84 7 5
72 7 5
*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值