倒水问题(搜索)
题意
有三个杯子,容量分别为。
初始时,杯装满了水,而杯都是空的。
现在在保证不会有漏水的情况下进行若干次如下操作:
将一个杯子中的水倒到另一个杯子中,当空了或者满了时就停止(满足其中一个条件才停下)。
请问,在操作全部结束后,中的水量有多少种可能性。
题目链接:https://www.acwing.com/problem/content/3514/
数据范围
思路
考虑用DFS爆搜,dfs(x, y, z)
表示当前搜索到的状态(三个杯子当前的水量)
下面主要分析时间复杂度。
每个状态至少会有一个杯子是空的或者满的,因此状态总数为
代码
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)