个人博客首页: KJ.JK
专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用C语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习
某探险队负责对地下洞穴进行探险。探险队成员在进行探险任务时,随身携带的记录器会不定期地记录自身的坐标,但在记录的间隙中也会记录其他数据。探索工作结束后,探险队需要获取到某成员在探险过程中相对于探险队总部的最远的足迹位置。
1、仪器记录坐标时,坐标的数据格式为(x,y),如(1,2)、(100,200),其中0
2、设定探险队总部的坐标为(0,0),某位置相对总部的距离为:xx+yy。
3、若两个座标的相对总部的距离相同,则第一次到达的坐标为最远的足迹。
4、若记录仪中的坐标都不合法,输出总部坐标(0,0)。
备注:
不需要考虑双层括号嵌套的情况,比如sfsdfsd((1,2))。
输入
字符串,表示记录仪中的数据。
如:ferga13fdsf3(100,200)f2r3rfasf(300,400)
输出
字符串,表示最远足迹到达的坐标。
如: (300,400)
输入
ferg(3,10)a13fdsf3(3,4)f2r3rfasf(5,10)
输出
(5,10)
说明:
记录仪中的合法坐标有3个: (3,10), (3,4), (5,10),其中(5,10)是相距总部最远的坐标, 输出(5,10)。
输入
asfefaweawfaw(0,1)fe
输出
(0,0)
说明:
记录仪中的坐标都不合法,输出总部坐标(0,0)
1、首先,定义一个函数isValidCoordinate来检查坐标的合法性,如果x或y的值不在合法范围内,则返回false。
2、在main函数中,首先声明一个字符串数组input用于存储输入数据。
3、通过fgets函数从标准输入中读取输入数据,并存储到input数组中。
4、定义变量maxDistance用于记录最大距离的平方,farthestX和farthestY用于记录最远足迹的坐标。
5、使用循环遍历输入字符串,当遇到'('时,将isValid标记为true,表示正在解析一个坐标。
6、使用sscanf函数从当前位置解析出x和y的值,并调用isValidCoordinate函数检查坐标的合法性。
7、如果解析成功且坐标合法,则计算相对总部的距离,并更新最远距离和对应的坐标。
当遇到')'时,将isValid标记为false,表示当前坐标解析结束。
8、如果当前字符不在坐标解析过程中,则将isValid标记为false。
9、最后根据最远距离是否为0来输出结果,如果是0,则输出"(0,0)",否则输出最远足迹的坐标。
#include
#include
bool isValidCoordinate(int x, int y) {
// 坐标值的合法性检查
if (x < 1 || x > 999 || y < 1 || y > 999) {
return false;
}
return true;
}
int main() {
char input[1000];
printf("请输入记录仪中的数据:");
fgets(input, sizeof(input), stdin);
int maxDistance = 0;
int farthestX = 0;
int farthestY = 0;
int x, y;
bool isValid = false;
// 从输入字符串中解析坐标数据
for (int i = 0; input[i] != '\0'; i++) {
if (input[i] == '(') {
isValid = true;
int scanfResult = sscanf(&input[i + 1], "%d,%d", &x, &y);
if (scanfResult == 2 && isValidCoordinate(x, y)) {
// 计算相对总部的距离
int distance = x * x + y * y;
if (distance > maxDistance) {
maxDistance = distance;
farthestX = x;
farthestY = y;
}
}
} else if (input[i] == ')') {
isValid = false;
} else if (!isValid) {
isValid = false;
}
}
if (maxDistance == 0) {
printf("(0,0)\n");
} else {
printf("(%d,%d)\n", farthestX, farthestY);
}
return 0;
}