记录编号 604805 评测结果 AAAAAAAAAA
题目名称 3659.[SYOI 2022]倒水 最终得分 100
用户昵称 Gravatar淮淮清子 是否通过 通过
代码语言 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;
}