题解 | 小红走网格
小红走网格
https://www.nowcoder.com/practice/43498993d39246c58e35ca715faea7ab
#include <iostream> // 包含输入输出流相关的头文件 #include <vector> // 包含 vector 容器相关的头文件 using namespace std; // 使用标准命名空间,避免重复写 std:: // 自定义 gcd 函数,计算两个数的最大公约数 int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); // 使用递归方式计算最大公约数 } // 判断是否可以到达目标位置的函数 bool canReach(int x, int y, int a, int b, int c, int d) { // 判断x方向是否可达:x 必须是 c 和 d 的最大公约数的倍数 if (x % gcd(c, d) != 0) { return false; // 如果 x 不是 gcd(c, d) 的倍数,返回 false } // 判断y方向是否可达:y 必须是 a 和 b 的最大公约数的倍数 if (y % gcd(a, b) != 0) { return false; // 如果 y 不是 gcd(a, b) 的倍数,返回 false } return true; // 如果 x 和 y 都满足条件,返回 true } int main() { int T; // 定义变量 T,表示测试数据的组数 cin >> T; // 从标准输入读取测试数据组数 T // 创建一个二维向量 data,用于存储每组测试数据 vector<vector<int>> data(T, vector<int>(6)); // 每组数据包含 6 个整数 // 读取每组测试数据 for (int i = 0; i < T; ++i) { // 遍历每组测试数据 for (int j = 0; j < 6; ++j) { // 遍历每组数据中的 6 个整数 cin >> data[i][j]; // 从标准输入读取每个整数并存储到 data 中 } } // 对每组测试数据判断是否可以到达目标位置 for (int i = 0; i < T; ++i) { // 遍历每组测试数据 // 从 data 中提取每组数据的 6 个整数 int x = data[i][0], y = data[i][1], a = data[i][2], b = data[i][3], c = data[i][4], d = data[i][5]; if (canReach(x, y, a, b, c, d)) { // 调用 canReach 函数判断是否可以到达目标位置 cout << "YES" << endl; // 如果可以到达,输出 "YES" } else { cout << "NO" << endl; // 如果不能到达,输出 "NO" } } return 0; // 程序正常结束,返回 0 }#笔试编程题##牛客创作赏金赛#