题目描述:
解题思路:
题目解读:
求从[0,0]出发,到达二阶矩阵任意点[a,b]的最小步数。矩阵长和宽的范围都是[-100,100]。
而且他这个每一步要求,不能和上一步动作相同,就是上一步是往下,那这一步只能往上、左、右或者不动。
画个图不难理解,如果|a|=|b|,此时目标在对角线上,直接2|a| or 2|b| or |a|+|b| 即可。
那当不在对角线上时,最短路径肯定首先得奔着目标方向去,比如目标为[3,5],那我先到[3,3],如果到[3,3]的这步不是向右,那可以直接向右一步到[3,4];但此时不能直接向右一步到达[3,5],但在此时与变换方向迂回到达[3,5]相比,选择不动+向右更快。即移动思路为,先到最近的对角线位置,然后靠近一位,再以不动+动的方式不断靠近。
还有一种思路:数学归纳可以得出,不在对角线上时,最小步数为2 * Max(|a|, |b|) - 1)
代码实现:
//普通方法
#include<bits/stdc++.h>
using namespace std;
int Max(int a, int b) {
return a > b ? a : b;
}
int Min(int a, int b) {
return a < b ? a : b;
}
void solve() {
int a, b;
scanf("%d%d", &a ,&b); //去掉中间的空格
a = abs(a);
b = abs(b);
if (a==b) printf("%d\n",a+b);
else printf("%d\n", (2 * Min(a, b) + 1) + (2 * (Max(a,b) - (Min(a, b) + 1))));
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
solve();
}
return 0;
}
//数学归纳
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>
int Max(int a, int b) {
return a > b ? a : b;
}
void Solve() {
int a, b;
scanf("%d%d", &a, &b);
a = abs(a);
b = abs(b);
if (a == b) printf("%d\n", a + b);
else printf("%d\n", 2 * Max(a, b) - 1);
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
Solve();
}
return 0;
}
遇到的错误:输入输出格式不严谨
scanf("%d %d", &a ,&b); //需要去掉中间的空格,不然读入会是个脏数据,没法正确获得后面输入的b。
printf("%d\n", a + b); //需要加换行符,否则几个输出结果堆一起也错误。