倒水问题(搜索)

题意

有三个杯子,容量分别为A,B,C

初始时,C杯装满了水,而A,B杯都是空的。

现在在保证不会有漏水的情况下进行若干次如下操作:

将一个杯子x中的水倒到另一个杯子y中,当x空了或者y满了时就停止(满足其中一个条件才停下)。

请问,在操作全部结束后,C中的水量有多少种可能性。

题目链接:https://www.acwing.com/problem/content/3514/

数据范围

0A,B,C4000

思路

考虑用DFS爆搜,dfs(x, y, z)表示当前搜索到的状态(三个杯子当前的水量)

下面主要分析时间复杂度。

每个状态至少会有一个杯子是空的或者满的,因此状态总数为O(4001400123)

代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <set>

using namespace std;

typedef pair<int, int> pii;
typedef pair<pii, int> ppi;

int v[3];
set<int> ans;
set<ppi> st;

void dfs(int x, int y, int z)
{
    ans.insert(z);
    st.insert({{x, y}, z});
    int t[3] = {x, y, z};
    for(int i = 0; i < 3; i ++) {
        for(int j = 0; j < 3; j ++) {
            if(i == j) continue;
            int tt[3] = {x, y, z};
            int mi = min(tt[i], v[j] - tt[j]);
            tt[i] -= mi, tt[j] += mi;
            if(!st.count({{tt[0], tt[1]}, tt[2]})) dfs(tt[0], tt[1], tt[2]);
        }
    }
}

int main()
{
    while(~scanf("%d%d%d", &v[0], &v[1], &v[2])) {
        ans.clear();
        st.clear();
        dfs(0, 0, v[2]);
        printf("%d\n", ans.size());
    }
    return 0;
}
posted @   pbc的成长之路  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示