记录编号 |
604805 |
评测结果 |
AAAAAAAAAA |
题目名称 |
3659.[SYOI 2022]倒水 |
最终得分 |
100 |
用户昵称 |
淮淮清子 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.030 s |
提交时间 |
2025-08-11 21:24:19 |
内存使用 |
3.74 MiB |
显示代码纯文本
#include <iostream>
#include <queue>
#include <cstring>
#include <ctime>
using namespace std;
int A, B, C, z;
bool vis[101][101][101];
struct node{
int a, b, c, step;
};
queue<node> q;
int main(){
freopen("pourwater.in","r",stdin);
freopen("pourwater.out","w",stdout);
cin >> A >> B >> C >> z;
if(z > A){
cout << "false\n";
return 0;
}
q.push({A, 0, 0, 0});
vis[A][0][0] = true;
auto fuck = [&](int a,int b,int c) -> bool{return (a == z) || (b == z) || (c == z);};
while(!q.empty()){
if((double)clock() / CLOCKS_PER_SEC >= 0.98){
cout << "false\n";
return 0;
}
node cur = q.front(); q.pop();
int a = cur.a, b = cur.b, c = cur.c, step = cur.step;
if(fuck(a, b, c)){
cout << step << "\n";
return 0;
}
if(a > 0 && b < B){
int pour = min(a, B - b);
int na = a - pour, nb = b + pour, nc = c;
if(!vis[na][nb][nc]){
vis[na][nb][nc] = true;
q.push({na, nb, nc, step + 1});
}
}
if(a > 0 && c < C){
int pour = min(a, C - c);
int na = a - pour, nb = b, nc = c + pour;
if(!vis[na][nb][nc]){
vis[na][nb][nc] = true;
q.push({na, nb, nc, step + 1});
}
}
if(b > 0 && a < A){
int pour = min(b, A - a);
int na = a + pour, nb = b - pour, nc = c;
if(!vis[na][nb][nc]){
vis[na][nb][nc] = true;
q.push({na, nb, nc, step + 1});
}
}
if(b > 0 && c < C){
int pour = min(b, C - c);
int na = a, nb = b - pour, nc = c + pour;
if(!vis[na][nb][nc]){
vis[na][nb][nc] = true;
q.push({na, nb, nc, step + 1});
}
}
if(c > 0 && a < A){
int pour = min(c, A - a);
int na = a + pour, nb = b, nc = c - pour;
if(!vis[na][nb][nc]){
vis[na][nb][nc] = true;
q.push({na, nb, nc, step + 1});
}
}
if(c > 0 && b < B){
int pour = min(c, B - b);
int na = a, nb = b + pour, nc = c - pour;
if(!vis[na][nb][nc]) {
vis[na][nb][nc] = true;
q.push({na, nb, nc, step + 1});
}
}
}
cout << "false\n";
return 0;
}