杯具倒水

这篇博客探讨了一种使用深度优先搜索(DFS)算法解决数学问题的实例。具体问题是,给定两个不规则容量的杯子a升和b升,以及一个无限水源,判断能否通过倒水操作量出c升的水。博主提供了两种解决方案:一种是基于最大公约数(GCD)的简单判断方法,另一种是采用DFS暴力搜索所有可能的倒水组合。代码示例展示了这两种方法的实现,帮助读者理解如何在实际问题中应用算法思维。
摘要由CSDN通过智能技术生成

(机器人协会友情赞助)

在你面前有两个不规则的杯具,分别容积为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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值