把这里当博客用2333 做一下上课笔记
C++ 代码
//知识点:开一个数组,只有当数组被赋值的时候,操作系统才会给空间,所以开一个数组不一定会占用空间
/*算法题目里面的距离问题只有两种:1.曼哈顿距离 s = |x1 - x2| + |y1 - y2| 标明两个点在标准坐标系上的绝对轴距总和。
2. 欧几里德距离 就是两点间距离公式 sqrt( (x1-x2)^2+(y1-y2)^2)*/
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int N = 10010;
int a[N][N];
int w;
int n,m;
int step;
int main(){
/*cin >> w >> n >> m;
int ma = max(n,m);
int i = 1;
int flag = 0;//翻转
int k = 1;
while(i <= ma){
if(flag == 0){
for(int j = 1; j <= w; j++)
a[k][j] = i;
i++;
}
if(flag == 1){
for(int j = w; j >= 1; j--)
a[k][j] = i;
i++;
}
if(flag == 0) flag = 1;
else flag = 0;
k++;
}
//上面那段代码都是废掉的 上面的代码思路是把矩阵打出来,然后去从头到尾搜索一边,但是搜索的边界是啥?不清楚,就我个人认为这玩意是搜不出来的.因为没有边界条件
return 0;*/
//yxc大佬讲解的思路:
//由曼哈顿距离公式就能求出距离 那么现在的难点是怎么将楼在矩阵里的坐标求出来
//因为C++语法上数组是从0开始的,我们做一个映射,将矩阵的数全部减1,达到从0开始的目的.
//我们可以由规律找到蛇形矩阵中 行号 = n or m / w(矩阵的打横的宽度)
//列号 : 对于正常排列的矩阵,列号是用那个数去对宽度取余. 列从0开始算的话,假如现在是蛇形的矩阵,我们可以看到1 3 5 奇数行的数字是倒过来存的。
//所以只要把奇数行里面的数,变回正常矩阵的数,就能求出列号。例如蛇形排列的 0 1 2 3 4 5 11 10 9 8 7 6 ,从0开始数行,第1行是奇数行,那么将11变回原来应该是的数,11应该是6,将隔了五个位置的数互换就能求出当前的列号.
cin >> w >> n >> m;
int x1,x2,y1,y2;
n --, m --;//将从1开始的矩阵映射为从0开始的矩阵
x1 = n / w;
x2 = m / w;
if(x1 % 2 == 0){
y1 = n % w;
}
else{
y1 = w - 1 - n % w;
}
if(x2 % 2 == 0){
y2 = m % w;
}
else{
y2 = w - 1 - m % w;
}
step = abs(x1 - x2) + abs(y1 - y2);
cout << step;
return 0;
}