杯具倒水

(机器人协会友情赞助)

在你面前有两个不规则的杯具,分别容积为a升和b升,还有一个水缸(水无限多)可供装水,那么能不能通过两个杯具的装倒水操作,量出c升的水?

输入格式:

输入的第一行包含一个整数n(n<100),表示包括表示测试数据数 接下来n行,每行三个整数a,b,c其中(1<=a
输出格式:

输出n行 每行输出一个整数,1表示可量出c升水,0表示不能
输入样例:

在这里给出一组输入。例如:

3
3 5 4
7 11 5
9 15 10

输出样例:

在这里给出相应的输出。例如:

1
1
0

说实话,这道题这规律我实在是想不起来,不过我的一个同学用dfs暴力也做出来了这道题,我把代码放一下:

规律解法

//
// Created by TIGA_HUANG on 2020/10/5.
//

#include<iostream>

using namespace std;

int gcd(int a, int b) {
    
    
    if (b == 0) return a;
    else return gcd(b, a % b);
}

int main() {
    
    
    int n;
    cin >> n;
    int a, b, c;
    while (n--) {
    
    
        cin >> a >> b >> c;
        if (c % gcd(a, b) == 0)
            cout << "1\n";
        else
            cout << "0\n";
    }
}

暴力解法

#include<cstdio>
#include<cstring>

using namespace std;
typedef long long ll;
int a, b, c, flag;
bool v[5000][5000];

void dfs(int A, int B) {
    
    
    if (flag) return;
    if (A == c || B == c) {
    
    
        flag = 1;
        return;
    }
    v[A][B] = 1;
    int x, y;
    if (!v[a][B]) dfs(a, B);
    if (!v[A][b]) dfs(A, b);
    if (!v[a][b]) dfs(a, b);
    if (!v[0][B]) dfs(0, B);
    if (!v[A][0]) dfs(A, 0);
    if (A && B != b) {
    
    
        x = b - B;
        if (x > A) {
    
    
            B += A;
            A = 0;
        } else {
    
    
            B = b;
            A -= x;
        }
        if (!v[A][B]) dfs(A, B);
    }

    if (B && A != a) {
    
    
        x = a - A;
        if (x > B) {
    
    
            A += B;
            B = 0;
        } else {
    
    
            A = a;
            B -= x;
        }
        if (!v[A][B]) dfs(A, B);
    }
}

int main() {
    
    
    int x, y, i, n, j;
    scanf("%d", &n);
    while (n--) {
    
    
        flag = 0;
        scanf("%d %d %d", &a, &b, &c);
        memset(v, 0, sizeof(v));
        dfs(0, 0);
        if (flag) printf("1\n");
        else printf("0\n");
    }

    return 0;

猜你喜欢

转载自blog.csdn.net/qq_44378358/article/details/108942058