曼哈顿距离与曼哈顿矩形

  • 食用指南:
  • 题目描述:
  • 题目分析:
    • 法一:曼哈顿距离
    • 法二:数组下标与值的关系
      • 方向1:用距离推导关系
      • 方向2:只看下标和值关系
    • 法三:对称化简(严格说属于技巧而非方法)
  • 算法模板:
  • 代码实现:
    • 法一:
    • 法二:
    • 法三:
  • 注意点:

食用指南:

Leetcode专栏开启了,由于博主闭关期末,所以每日只能一题
尽量做到一题多解,先说思路,之后代码实现,会添加必要注释
语法或STL内容会在注意点中点出,新手友好
欢迎关注博主神机百炼专栏,内涵算法基础详细讲解和代码模板

题目描述:

  • 输入整数 N,输出一个 N 阶的回字形二维数组。

    数组的最外层为 1,次外层为 2,以此类推。

    输入格式
    输入包含多行,每行包含一个整数 N。
    当输入行为 N=0 时,表示输入结束,且该行无需作任何处理。

    输出格式
    对于每个输入整数 N,输出一个满足要求的 N 阶二维数组。
    每个数组占 N 行,每行包含 N 个用空格隔开的整数。
    每个数组输出完毕后,输出一个空行。

    数据范围
    0≤N≤100
    输入样例:
    1
    2
    3
    4
    5
    0
    输出样例:
    1

    1 1
    1 1

    1 1 1
    1 2 1
    1 1 1

    1 1 1 1
    1 2 2 1
    1 2 2 1
    1 1 1 1

    1 1 1 1 1
    1 2 2 2 1
    1 2 3 2 1
    1 2 2 2 1
    1 1 1 1 1

  • 题目来源:https://www.acwing.com/problem/content/755/

题目分析:

法一:曼哈顿距离

  • 曼哈顿距离是两点在垂直坐标系中,x & y方向投影距离最大值

  • 应用在数组/矩阵中,曼哈顿距离相同的点集合成为围绕矩阵中心的一圈矩形

    在计算曼哈顿距离时,需要区分行数/列数的奇偶:

法二:数组下标与值的关系

  • 曼哈顿距离其实就是数组下标和值关系研究所得的结论

    当你不知道曼哈顿距离时,不妨试试手动探究一下,可能得到非曼哈顿距离的其他结论

方向1:用距离推导关系

  1. 该图关于中心对称
    未越过中线的点用i计算,越过中线的点用n-1-i计算,
    对于所有点,要么 i 和 n-1-i/n-i 各计算一次,两者取最大/小值, 要么采用绝对值
    2. 对于未过中线的点,采用举例探究
    n = 5时,n/2 = 2,中点为(2, 2)
    第一个点arr[0][0] = 1,距离中点Δx = Δy =2
    第二个点arr[1][0] = 1,距离终点Δx = 2, Δy =1
    第三个点arr[0][1] = 1,距离终点Δx = 1, Δy =2
    确定计算公式:n/2 - max(abs(x-n/2) , abs(y-n/2)) + 1
    3. 对于过了中线的点,采用举例探究
    n = 5时,n/2 = 2,中点为(2, 2)
    第一个点arr[4][4] = 1,距离中点Δx = Δy =2
    第二个点arr[3][4] = 1,距离终点Δx = 1, Δy =2
    第三个点arr[4][3] = 1,距离终点Δx = 2, Δy =1
    确定计算公式:n/2 - max(abs(x-n/2) , abs(y-n/2)) + 1
  • 完成用距离推导后,你会发现你其实推得的就是曼哈顿距离,

方向2:只看下标和值关系

  • n = 5时:

    1. 对于未过中线的点,采用举例探究:
      第一个点arr[0][0] = 1,1 = max/min(x + 1, y + 1)
      第二个点arr[1][0] = 1,1 = min(x + 1, y + 1)
      第三个点arr[0][1] = 1,1 = min(x + 1, y + 1)
      石锤采用min(x + 1, y + 1)
    2. 对于过了中线的点,采用举例探究:
      第一个点arr[4][4] = 1,1 = max/min(n-x, n-y)
      第二个点arr[3][4] = 1,1 = min(n-x, n-y)
      第三个点arr[4][3] = 1,1 = min(n-x, n-y)
      石锤采用min(n-x, n-y)
      3.整体来看所有点:
      现在有两种方案:min(x + 1, y + 1) & min(n-x, n-y)
      查看是否同时采用/舍弃哪一种?
      对于点arr[3][4],min(x + 1, y + 1) = 4, min(n-x, n-y) = 1
      对于点arr[0][0],min(x + 1, y + 1) = 1, min(n-x, n-y) = 5
      发现对于每个点都取两种方案的最小值,所以得出结论:
  • 所以对于所有点:arr[i][j] = min(min(x + 1, y + 1) , min(n-x, n-y));

法三:对称化简(严格说属于技巧而非方法)

  • 中心对称图像,填写一点相当于填写了4点。

    以n = 5的矩形为例,查看对称的4点下标关系:

  • 在填写一个象限的值时,可以采用曼哈顿矩阵法 / 下标与值关系规律

    这个技巧提升了时间复杂度,将时间缩减到原本的四分之一

    也可以在之后题目中作为一个化简找规律时的思考出发点

算法模板:

  • 曼哈顿距离 + 中心对称规律 本身就是基础算法,无模板

代码实现:

法一:

import java.util.Scanner;
import java.lang.Math;
public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);while(true){int n = sc.nextInt();if (n == 0) return;     //读取终止出口for(int i=0; i<n; i++){for(int j=0; j<n; j++){if(n % 2 == 1)//曼哈顿距离近者,值大,距离为0者值为(n+1)/2System.out.print((n+1)/2 - Math.max(Math.abs(n/2-i), Math.abs(n/2-j)) +" ");else //曼哈顿距离近者,值大,距离为0者值为n/2System.out.print((n/2) - Math.max((int)Math.abs((n-1)/2.0-i), (int)Math.abs((n-1)/2.0-j)) +" ");}System.out.println();}System.out.println();}}
}

法二:

  • 下标和值关系:Math.min(Math.min(i+1, j+1), Math.min(n-i, n-j))
import java.util.Scanner;
import java.lang.Math;
public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);while(true){int n = sc.nextInt();if (n == 0) return;     //读取终止出口for(int i=0; i<n; i++){for(int j=0; j<n; j++){System.out.print(Math.min(Math.min(i+1, j+1), Math.min(n-i, n-j))+" ");}System.out.println();}System.out.println();}}
}

法三:

  • 曼哈顿距离填法:
import java.util.Scanner;
import java.lang.Math;
public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);while(true){int n = sc.nextInt();if (n == 0) return;     //读取终止出口int[][] arr = new int[n][n];//偶数行列,如4行4列,只需填0~1行 & 0~1列if(n % 2 == 0){for(int i=0; i<n/2; i++){for(int j=0; j<n/2; j++){arr[i][j] = arr[n-1-i][n-1-j] = arr[n-1-i][j] = arr[i][n-1-j] = n/2 - Math.max(Math.abs((int)((n-1)/2.0 - i)), Math.abs((int)((n-1)/2.0 - j)));}}}//奇数行列,如5行5列,需要填0~2行 & 0~2列else{for(int i=0; i<=n/2; i++){for(int j=0; j<=n/2; j++){arr[i][j] = arr[n-1-i][n-1-j] = arr[n-1-i][j] = arr[i][n-1-j] = (n+1)/2 - Math.max(Math.abs(n/2 - i), Math.abs(n/2 - j));}}}for(int i=0; i<n; i++){for(int j=0; j<n; j++){System.out.print(arr[i][j]+" ");}System.out.println();}System.out.println();}}
}
  • 下标和值关系填法:
import java.util.Scanner;
import java.lang.Math;
public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);while(true){int n = sc.nextInt();if (n == 0) return;     //读取终止出口int[][] arr = new int[n][n];//偶数行列,如4行4列,只需填0~1行 & 0~1列if(n % 2 == 0){for(int i=0; i<n/2; i++){for(int j=0; j<n/2; j++){arr[i][j] = arr[n-1-i][n-1-j] = arr[n-1-i][j] = arr[i][n-1-j] = Math.min(Math.min(i+1, j+1), Math.min(n-i, n-j));}}}//奇数行列,如5行5列,需要填0~2行 & 0~2列else{for(int i=0; i<=n/2; i++){for(int j=0; j<=n/2; j++){arr[i][j] = arr[n-1-i][n-1-j] = arr[n-1-i][j] = arr[i][n-1-j] = Math.min(Math.min(i+1, j+1), Math.min(n-i, n-j));}}}for(int i=0; i<n; i++){for(int j=0; j<n; j++){System.out.print(arr[i][j]+" ");}System.out.println();}System.out.println();}}
}

注意点:

  • 曼哈顿距离计算公式:

    • 行/列数为奇:
      manhattan = max(abs(x - n/2), abs(y - n/2));
      即中点 n/2 向下取整,而结果本身是整数
    • 行/列数为偶:
      manhattan = max((int)abs(x - (n-1)/2.0), (int)abs(y-(n-1)/2.0));
      即中点为小数不取整,而 x - (n-1)/2.0的结果向下取整
    • 可以简记为,奇数中点直接除2,偶数中点-1除以2.0
  • 对于安全性要求较高的Java
    double 和 int 运算,也是先Int整型提升到double再与double运算
    将Double用(int)显式类型转化为int,也是默认向下取整

曼哈顿距离与曼哈顿矩形-打印回字型矩阵相关推荐

  1. cass方格网数据excel_讨论|CASS怎么计算回字型土方? 124

    大家好,欢迎来到我的专栏.这是我原创的第124篇CASS应用技术干货文章.希望对你有所帮助,写文不易,请点赞哦! 回字型土方工程,就是计算区域内部,有一个或多个不参加计算的区域,这种区域也就是常说的& ...

  2. 中点坐标公式 矩形_2019南充第16题——平面直角坐标系、矩形、K字型相似、运动与最值...

    2019南充第16题--平面直角坐标系.矩形.K字型相似.运动与最值 2019广元第15题--抛物线.代数式的取值范围 2019广元第10题--正比例函数.直角三角形.面积.找规律 2019哈尔滨第2 ...

  3. 2个点马氏距离计算实例_数据分析基础:距离度量方式(欧式距离、马氏距离、曼哈顿距离)...

    数据分析中,为了评定数据之间的相似度,有很多不同的距离的计算方法,如欧氏距离,马氏距离等等. 欧氏距离 Euclidean distance:欧几里得距离,m维空间中两个点之间的真实距离 离差平方和, ...

  4. 曼哈顿距离最小生成树与莫队算法(总结)

    曼哈顿距离最小生成树与莫队算法(总结) 1 曼哈顿距离最小生成树 曼哈顿距离最小生成树问题可以简述如下:  给定二维平面上的N个点,在两点之间连边的代价为其曼哈顿距离,求使所有点连通的最小代价.  朴 ...

  5. 【数据结构】最大曼哈顿距离

    问题描述: 给一系列操作,每个操作是新增或删除一个高维点(1-5维),给出每次操作后现有点集里两点的最大曼哈顿距离.曼哈顿距离是指两个点的一范数,即每个维度差的绝对值之和. 输入: 第一行有两个数,第 ...

  6. 简单粗暴理解与实现机器学习之K-近邻算法(三):距离度量、欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准化距离、余弦距离、汉明距离、杰卡德距离、马氏距离

    K-近邻算法 文章目录 K-近邻算法 学习目标 1.3 距离度量 1 欧式距离**(Euclidean Distance):** 2 **曼哈顿距离(Manhattan Distance):** 3 ...

  7. 各种距离 欧式距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准欧氏距离、马氏距离、余弦距离、汉明距离、杰拉德距离、相关距离、信息熵...

    1. 欧氏距离(Euclidean Distance) 欧氏距离是最容易直观理解的距离度量方法,我们小学.初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离. 二维平面上点a(x1,y1)与b( ...

  8. 什么是范数,及其对应的 “曼哈顿距离“、“欧式距离“、“闵氏距离“、“切比雪夫距离“

    什么是范数,及其对应的 "曼哈顿距离"."欧式距离"."闵氏距离"."切比雪夫距离" 一.什么是范数 二.欧式距离(对应 ...

  9. 曼哈顿距离及其应用场景/曼哈顿距离与欧氏距离的不同

    欧氏距离 上过初中的同学都知道,欧式距离是用来运算两个坐标之间的直线差值的方法,其公式为: 在一维坐标系内: d = ∣ x 1 − x 2 ∣ d = |x_1-x_2| d=∣x1​−x2​∣ 在 ...

最新文章

  1. Xamarin XAML语言教程构建ControlTemplate控件模板 (二)
  2. 复合五点高斯公式计算(Python实现)
  3. 激进or务实?HEVC、AV1 和私有Codecs现状
  4. SAP CRM系统里Opportunity预期销售金额和货币相关的自动转换
  5. React Native之函数作为参数传递给另外一个函数去调用
  6. servlet设置cookie实验
  7. 模拟驾驶能力输出,赋能客户提升稳定性信心
  8. Spring -Bean的作用域
  9. Shiro的subject实质上是当前执行用户的特定视图。
  10. php大转盘,php大转盘
  11. mysql临键锁_详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)
  12. NYOJ1282部分和问题--DFS剪枝入门
  13. 色彩的对比度和饱和度_使用高色彩对比度进行更方便的设计
  14. Loadrunner11破解完成添加License失败
  15. 计算机学拼音打字,拼音打字练习
  16. centos-ssh-channel is not opened.
  17. creo打不开stp文件_为什么stp网站打不开 creo打不开stp文件
  18. 操作系统知识点总结和题集大杂烩
  19. c语言语法生成器,C中的生成器
  20. 无障碍开发系列之准则及评级

热门文章

  1. exchange问题
  2. 华为手机root_免root傻瓜式操作华为手机应用精简卸载系统应用YUYU助手
  3. 计算机与智能化专业课程,计算机与人工智能专业方向课程大纲介绍-Artificial Intelligence 人工智能(原创)...
  4. ps修改dds贴图_3DsMax+PS制作发光logo
  5. Linux 中断处理
  6. H5的新特性及部分API详解
  7. Python爬虫笔记——BeautifulSoup模块
  8. OCR之:Pytesseract端到端文字识别(包含源代码以及极为详细的解释)
  9. 互联网用户研究调查报告PPT写法(收藏)
  10. ORA-01653: 表xx无法通过 8192 (在表空间 xx_data 中) 扩展