HDU - 1495 非常可乐(BFS)

15 篇文章 0 订阅

题目大意:中文题。一开始以为一定要两个杯子相同,后来发现瓶子也是可以当杯子用的,只要均分就行……天真了
解题思路:六个入口 BFS,没什么难的,复制的时候漏改了调了好久才发现

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<string>
#include<queue>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
const int INF = 0x3f3f3f3f;
const int NINF = -INF -1;
const int MAXN = 100+10;
using namespace std;
struct point {
    int s, n, m;
    int cnt;
};
bool vis[MAXN][MAXN][MAXN];
int S, N, M;
int bfs() {
    queue<point> q;
    point p;
    p.s = S;
    p.n = p.m = p.cnt = 0;
    q.push(p);
    vis[p.s][p.n][p.m] = 1;
    while (!q.empty()) {
        point now = q.front();
        q.pop();
//      printf("%d %d %d %d\n", now.s, now.n, now.m, now.cnt);
        if ((now.s == S/2 && now.n == S/2)||
            (now.s == S/2 && now.m == S/2)||
            (now.n == S/2 && now.m == S/2)) 
                return now.cnt;
        for (int i = 0; i < 6; i++) {
            p = now;
            p.cnt = now.cnt+1;
            if (i == 0) { //s->n
                p.n += p.s;
                p.s = 0;
                if (p.n > N) {
                    p.s = p.n - N;
                    p.n = N;
                }
            }
            if (i == 1) { //s->m
                p.m += p.s;
                p.s = 0;
                if (p.m > M) {
                    p.s = p.m - M;
                    p.m = M;
                }
            }
            if (i == 2) { //n->s
                p.s += p.n;
                p.n = 0;
                if (p.s > S) continue;
            }
            if (i == 3) { //n->m
                p.m += p.n;
                p.n = 0;
                if (p.m > M) {
                    p.n = p.m - M;
                    p.m = M;
                }
            }
            if (i == 4) { //m->s
                p.s += p.m;
                p.m = 0;
                if (p.s > S) continue;
            }
            if (i == 5) { //m->n
                p.n += p.m;
                p.m = 0;
                if (p.n > N) {
                    p.m = p.n - N;
                    p.n = N;
                }
            }
            if (!vis[p.s][p.n][p.m]) {
                q.push(p);
                vis[p.s][p.n][p.m] = 1;
            }
        }
    }
    return -1;
}
int main() {
    while (scanf("%d%d%d", &S, &N, &M) && S+N+M) {
        memset(vis, 0, sizeof(vis));
        int ans = -1;
        if (S%2 == 0) ans = bfs();
        if (ans == -1) printf("NO\n");
        else printf("%d\n", ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值