#P2997. 最远足迹(100分)
          
                        
                                    
                      
        
              - 
          
          
                      1000ms
            
          
                      Tried: 309
            Accepted: 82
            Difficulty: 7
            
          
          
          
                       所属公司 : 
                              华为od
                                
            
                      
          
 
- 
                        算法标签>模拟          
 
最远足迹(100分)
题面描述
某探险队负责对地下洞穴进行探险。探险队成员在进行探险任务时,随身携带的记录器会不定期地记录自身的坐标,但在记录的间隙中也会记录其他数据。探索工作结束后,探险队需要获取某成员在探险过程中相对于探险队总部的最远的足迹位置。
仪器记录坐标时,坐标的数据格式为 (x,y),如 (1,2)、(100,200),其中 0<x<1000,0<y<1000。
同时存在非法坐标,如 (01,1)、(1,01)、(0,100) 属于非法坐标。
设定探险队总部的坐标为 (0,0),某位置相对总部的距离为 x2+y2。
若两个坐标的相对总部的距离相同,则第一次到达的坐标为最远的足迹。
若记录仪中的坐标都不合法,输出总部坐标 (0,0)。
思路
模拟题,把表达式提取出来即可
- 提取坐标:遍历输入字符串,寻找符合模式的坐标 
(x,y)。 - 验证合法性:
x和y必须都是正整数,且没有前导零。0 < x < 1000且0 < y < 1000。
 - 计算距离:对于每个合法坐标,计算其相对于总部 
(0,0)的距离平方x^2 + y^2。 - 比较距离:找到距离最大的坐标,如果有多个坐标距离相同,选择第一次出现的坐标。
 - 输出结果:如果存在合法坐标,输出最远的坐标;否则,输出 
(0,0)。 
cpp
#include <bits/stdc++.h>
using namespace std;
int main(){
    string s;
    // 读取整个输入
    getline(cin, s);
    // 正则表达式匹配 (x,y) 格式
    regex coord_regex(R"(\((\d+),(\d+)\))");
    smatch match;
    // 迭代器用于遍历所有匹配
    auto it = s.cbegin();
    // 记录最大距离和对应坐标
    long long max_dist = -1;
    string result = "(0,0)";
    while(regex_search(it, s.cend(), match, coord_regex)){
        string x_str = match[1];
        string y_str = match[2];
        // 检查是否有前导零
        auto is_valid = [&](const string& num) -> bool{
            if(num.empty()) return false;
            if(num.size() > 1 && num[0] == '0') return false;
            return true;
        };
        if(is_valid(x_str) && is_valid(y_str)){
            int x = stoi(x_str);
            int y = stoi(y_str);
            if(x > 0 && x < 1000 && y > 0 && y < 1000){
                long long dist = (long long)x * x + (long long)y * y;
                if(dist > max_dist){
                    max_dist = dist;
                    result = "(" + to_string(x) + "," + to_string(y) + ")";
                }
            }
        }
        // 移动迭代器到当前匹配的下一个位置
        it = match[0].second;
    }
    cout << result;
    return 0;
}
python
import re
def main():
    s = input()
    # 正则表达式匹配 (x,y) 格式
    pattern = re.compile(r'\((\d+),(\d+)\)')
    matches = pattern.finditer(s)
    max_dist = -1
    result = "(0,0)"
    for match in matches:
        x_str, y_str = match.groups()
        # 检查是否有前导零
        def is_valid(num):
            return len(num) == 1 or num[0] != '0'
        if is_valid(x_str) and is_valid(y_str):
            x, y = int(x_str), int(y_str)
            if 0 < x < 1000 and 0 < y < 1000:
                dist = x * x + y * y
                if dist > max_dist:
                    max_dist = dist
                    result = f"({x},{y})"
    print(result)
if __name__ == "__main__":
    main()
java
import java.util.*;
import java.util.regex.*;
public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        // 正则表达式匹配 (x,y) 格式
        Pattern pattern = Pattern.compile("\\((\\d+),(\\d+)\\)");
        Matcher matcher = pattern.matcher(s);
        long maxDist = -1;
        String result = "(0,0)";
        while(matcher.find()){
            String xStr = matcher.group(1);
            String yStr = matcher.group(2);
            // 检查是否有前导零
            if(isValid(xStr) && isValid(yStr)){
                int x = Integer.parseInt(xStr);
                int y = Integer.parseInt(yStr);
                if(x > 0 && x < 1000 && y > 0 && y < 1000){
                    long dist = (long)x * x + (long)y * y;
                    if(dist > maxDist){
                        maxDist = dist;
                        result = "(" + x + "," + y + ")";
                    }
                }
            }
        }
        System.out.println(result);
    }
    // 检查数字是否有前导零
    private static boolean isValid(String num){
        if(num.length() == 0) return false;
        if(num.length() > 1 && num.charAt(0) == '0') return false;
        return true;
    }
}
        题目内容
某探险队负责对地下洞穴进行探险。探险队成员在进行探险任务时,随身携带的记录器会不定期地记录自身的坐标,但在记录的间隙中也会记录其他数据。探索工作结束后,探险队需要获取到某成员在探险过程中相对于探险队总部的最远的足迹位置。
仪器记录坐标时,坐标的数据格式为 (x,y) ,如 (1,2)、(100,200) ,其中 0<x<1000,0<y<1000。
同时存在非法坐标,如 (01,1)、(1,01),(0,100) 属于非法坐标。
设定探险队总部的坐标为 (0,0) ,某位置相对总部的距离为:xx+yy 。
若两个座标的相对总部的距离相同,则第一次到达的坐标为最远的足迹。
若记录仪中的坐标都不合法,输出总部坐标(0,0)。
备注:
不需要考虑双层括号嵌套的情况,比如 sfsdfsd((1,2)) 。
输入描述
字符串,表示记录仪中的数据。
如:ferga13fdsf3(100,200)f2r3rfasf(300,400)
输出描述
字符串,表示最远足迹到达的坐标。
如: (300,400)
样例1
输入
ferg(3,10)a13fdsf3(3,4)f2r3rfasf(5,10)
输出
(5,10)
说明
记录仪中的合法坐标有 3 个: (3,10),(3,4),(5,10), 其中 (5,10) 是相距总部最远的坐标, 输出 (5,10) 。
样例2
输入
asfefaweawfaw(0,1)fe
输出
(0,0)
说明
记录仪中的坐标都不合法,输出总部坐标(0,0)。