算法:解救小易

1. 题目描述

  有一片1000*1000的草地,小易初始站在(1,1)(最左上角的位置)。小易在每一秒会横向或者纵向移动到相邻的草地上吃草(小易不会走出边界)。大反派超超想去捕捉可爱的小易,他手里有n个陷阱。第i个陷阱被安置在横坐标为xi ,纵坐标为yi 的位置上,小易一旦走入一个陷阱,将会被超超捕捉。你为了去解救小易,需要知道小易最少多少秒可能会走入一个陷阱,从而提前解救小易。
输入描述:
  第一行为一个整数n(n ≤ 1000),表示超超一共拥有n个陷阱。
  第二行有n个整数xi,表示第i个陷阱的横坐标
  第三行有n个整数yi,表示第i个陷阱的纵坐标
  保证坐标都在草地范围内。
输出描述:
  输出一个整数,表示小易最少可能多少秒就落入超超的陷阱
示例:
  3
  4 6 8
  1 2 1
  输出:3

2. 思路分析

  题目描述了一大堆,总结一下就是找到在网格中距离左上角格点最近的格点。此时,我们就完成了问题的第一次转化,相对转化之前没有那么难理解了。
  然后就是要找最近的网格。根据题目描述,走法只有向右走、向下走。所以,走到指定格点最近的路线就是直走。即最近的路线为目标格点横轴绝对距离与纵轴绝对距离的和。即:对于点

(Xi,Yi)
,最近路线为
d=(Xi1)+(Yi1)=Xi+Yi2

  所以,遍历所有格点,找到d最小的输出即可。

3. C++实现

#include <iostream>
#include <vector>

using namespace std;

int n;
vector<int> x, y;

int trap(int n, vector<int>& x, vector<int>& y) {
    if(x.size() != y.size() || x.empty() || y.empty() || n <= 0)
        return 0;
    int min = x[0]-1 + y[0]-1;
    for(int i = 1; i < n; i++) {
        int mid = x[i] + y[i] - 2;
        if(mid < min)
            min = mid;
    }
    return min;
}

int main() {
    cin >> n;
    for(int i = 0; i < n; i++) {
        int midx;
        cin >> midx;
        x.push_back(midx);
    }
    for(int i = 0; i < n; i++) {
        int midy;
        cin >> midy;
        y.push_back(midy);
    }
    int ans = trap(n, x, y);
    cout << ans << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值