1484: order

题目描述

小军正在一块无穷大的网格地面上玩耍,他站在A 位置
小军准备了n 个指令a[i]
对于每个指令, 小军都会执行如下操作
1:往当前方向移动a[i] 的距离
2:往右转90 度,重复a[i] 次
小军决定执行这n 个指令T 次,假设执行完后停留在了B 位置,请问A 与B 的曼哈顿距离是多少

输入

第一行输入两个整数n, T
第二行输入n 个整数ai
1 <= T <= 100
1 <= n <= 50
1 <= ai <= 400000

输出

输出一个整数

样例输入

【样例输入1】
3 1
1 2 3
【样例输入2】
1 100
1
【样例输入3】
3 5
1 1 2

样例输出

【样例输出1】
2
【样例输出2】
0
【样例输出3】
10

题解:



图中红线代表曼哈顿距离,绿色代表欧氏距离,也就是直线距离,而蓝色和黄色代表等价的曼哈顿距离。曼哈顿距离——两点在南北方向上的距离加上在东西方向上的距离,即d(i,j)=|xi-xj|+|yi-yj|。对于一个具有正南正北、正东正西方向规则布局的城镇街道,从一点到达另一点的距离正是在南北方向上旅行的距离加上在东西方向上旅行的距离,因此,曼哈顿距离又称为出租车距离

接下来是正式的题解:

首先,定义a,b,c,d四个数分别表示向前、向后、向左、向右走的距离

接着,取个绝对值算出进行所有指令后的位置

最后,计算曼哈顿距离

代码:

#include <bits/stdc++.h>
#define MAXN 55
using namespace std;
int n,T;
int x[MAXN];
int a,b,c,d;
int main()
{
    cin >> n >> T;
    for(int i = 1 ;i <= n; ++i) cin >> x[i];
    int tmp = 0;
    a = 0;
    b = 0;
    c = 0;
    d = 0;
    int x1 = 0;
    int y1 = 0;
    for(int i = 1 ; i <= T ; ++i)
    {
        for(int j = 1 ; j <= n; ++j)
        {
            if(tmp == 0) a += x[j];
            else if(tmp == 1) b += x[j];
            else if(tmp == 2) c += x[j];
            else if(tmp == 3) d += x[j];
            tmp = (tmp + x[j]) % 4; 
        }
    }
    int x2 = abs(a - c);
    int y2 = abs(b - d);
    cout << abs(x1 - x2) + abs(y1 - y2) << endl;
}
发布了43 篇原创文章 · 获赞 12 · 访问量 3644

猜你喜欢

转载自blog.csdn.net/xzerui/article/details/104091052