2019年上交机试第二题

给出三个杯子的容量ABC , 其中刚开始时C杯是满的,AB是空的。
现在在保证不会有漏水的情况下进行如下操作:
将一个杯子x的水倒到另一个杯子y中,如果x空了或者y满了就停止(满足其中一个条件才停下)
现问C中水量有多少种可能性(A,B,C为非负整数)
60% case A,B,C<=100
100% case A,B,C<=4000
Sample Input
0 5 5
Sample Output
2

Sample Input
2 2 4
Sample Output
3

手动测试了几个例子都没问题,核心就是BFS

#include <iostream>
#include <cstdio>
#include <queue>

using namespace std;

//BFS

struct cups {
    int water[3];
};

const int MAXN = 4000 + 10;

bool visitab[MAXN][MAXN];
bool visitc[MAXN];

int main() {
    int v[3];
    scanf("%d%d%d", &v[0], &v[1], &v[2]);
    queue<cups> myqueue;
    cups head = {{0, 0, v[2]}};        //含数组的结构体初始化
    myqueue.push(head);
    for (int i = 0; i <= v[2]; ++i) {
        visitc[i] = false;
        for (int j = 0; j <= v[2]; ++j) {
            visitab[i][j] = false;
        }
    }
    visitab[0][0] = true;
    visitc[v[2]] = true;
    int c = 1;
    while (!myqueue.empty()) {
        cups head = myqueue.front();
        myqueue.pop();
        for (int i = 0; i < 3; ++i) {       //i往j里倒水
            for (int j = 0; j < 3; ++j) {
                cups current = head;
                if (v[i] == 0 || v[j] == 0 || i == j) {       //两个杯中有一个没体积,或者是同一个杯子
                    continue;
                }
                if (current.water[i] == 0 || current.water[j] == v[j]) {    //i空或者j满都不行
                    continue;
                } else {
                    if (current.water[i] >= v[j] - current.water[j]) {
                        current.water[i] -= v[j] - current.water[j];
                        current.water[j] = v[j];
                    } else {
                        current.water[j] += current.water[i];
                        current.water[i] = 0;
                    }
                }
                if (!visitc[current.water[2]]) {
                    c++;
                    visitc[current.water[2]] = true;
                }
                if (!visitab[current.water[0]][current.water[1]]) {        //如果当前情况没出现过,入队
                    myqueue.push(current);
                    visitab[current.water[0]][current.water[1]] = true;
                }
            }
        }
    }
    printf("%d\n", c);
    return 0;
}
全部评论

相关推荐

沉淀一会:**圣经 1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务