(机器人协会友情赞助)
在你面前有两个不规则的杯具,分别容积为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;