曼哈顿距离与曼哈顿矩形-打印回字型矩阵
曼哈顿距离与曼哈顿矩形
- 食用指南:
- 题目描述:
- 题目分析:
- 法一:曼哈顿距离
- 法二:数组下标与值的关系
- 方向1:用距离推导关系
- 方向2:只看下标和值关系
- 法三:对称化简(严格说属于技巧而非方法)
- 算法模板:
- 代码实现:
- 法一:
- 法二:
- 法三:
- 注意点:
食用指南:
Leetcode专栏开启了,由于博主闭关期末,所以每日只能一题
尽量做到一题多解,先说思路,之后代码实现,会添加必要注释
语法或STL内容会在注意点中点出,新手友好
欢迎关注博主神机百炼专栏,内涵算法基础详细讲解和代码模板
题目描述:
输入整数 N,输出一个 N 阶的回字形二维数组。
数组的最外层为 1,次外层为 2,以此类推。
输入格式
输入包含多行,每行包含一个整数 N。
当输入行为 N=0 时,表示输入结束,且该行无需作任何处理。输出格式
对于每个输入整数 N,输出一个满足要求的 N 阶二维数组。
每个数组占 N 行,每行包含 N 个用空格隔开的整数。
每个数组输出完毕后,输出一个空行。数据范围
0≤N≤100
输入样例:
1
2
3
4
5
0
输出样例:
11 1
1 11 1 1
1 2 1
1 1 11 1 1 1
1 2 2 1
1 2 2 1
1 1 1 11 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:用距离推导关系
- 该图关于中心对称
未越过中线的点用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时:
- 对于未过中线的点,采用举例探究:
第一个点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) - 对于过了中线的点,采用举例探究:
第一个点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,也是默认向下取整
曼哈顿距离与曼哈顿矩形-打印回字型矩阵相关推荐
- cass方格网数据excel_讨论|CASS怎么计算回字型土方? 124
大家好,欢迎来到我的专栏.这是我原创的第124篇CASS应用技术干货文章.希望对你有所帮助,写文不易,请点赞哦! 回字型土方工程,就是计算区域内部,有一个或多个不参加计算的区域,这种区域也就是常说的& ...
- 中点坐标公式 矩形_2019南充第16题——平面直角坐标系、矩形、K字型相似、运动与最值...
2019南充第16题--平面直角坐标系.矩形.K字型相似.运动与最值 2019广元第15题--抛物线.代数式的取值范围 2019广元第10题--正比例函数.直角三角形.面积.找规律 2019哈尔滨第2 ...
- 2个点马氏距离计算实例_数据分析基础:距离度量方式(欧式距离、马氏距离、曼哈顿距离)...
数据分析中,为了评定数据之间的相似度,有很多不同的距离的计算方法,如欧氏距离,马氏距离等等. 欧氏距离 Euclidean distance:欧几里得距离,m维空间中两个点之间的真实距离 离差平方和, ...
- 曼哈顿距离最小生成树与莫队算法(总结)
曼哈顿距离最小生成树与莫队算法(总结) 1 曼哈顿距离最小生成树 曼哈顿距离最小生成树问题可以简述如下: 给定二维平面上的N个点,在两点之间连边的代价为其曼哈顿距离,求使所有点连通的最小代价. 朴 ...
- 【数据结构】最大曼哈顿距离
问题描述: 给一系列操作,每个操作是新增或删除一个高维点(1-5维),给出每次操作后现有点集里两点的最大曼哈顿距离.曼哈顿距离是指两个点的一范数,即每个维度差的绝对值之和. 输入: 第一行有两个数,第 ...
- 简单粗暴理解与实现机器学习之K-近邻算法(三):距离度量、欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准化距离、余弦距离、汉明距离、杰卡德距离、马氏距离
K-近邻算法 文章目录 K-近邻算法 学习目标 1.3 距离度量 1 欧式距离**(Euclidean Distance):** 2 **曼哈顿距离(Manhattan Distance):** 3 ...
- 各种距离 欧式距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准欧氏距离、马氏距离、余弦距离、汉明距离、杰拉德距离、相关距离、信息熵...
1. 欧氏距离(Euclidean Distance) 欧氏距离是最容易直观理解的距离度量方法,我们小学.初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离. 二维平面上点a(x1,y1)与b( ...
- 什么是范数,及其对应的 “曼哈顿距离“、“欧式距离“、“闵氏距离“、“切比雪夫距离“
什么是范数,及其对应的 "曼哈顿距离"."欧式距离"."闵氏距离"."切比雪夫距离" 一.什么是范数 二.欧式距离(对应 ...
- 曼哈顿距离及其应用场景/曼哈顿距离与欧氏距离的不同
欧氏距离 上过初中的同学都知道,欧式距离是用来运算两个坐标之间的直线差值的方法,其公式为: 在一维坐标系内: d = ∣ x 1 − x 2 ∣ d = |x_1-x_2| d=∣x1−x2∣ 在 ...
最新文章
- Xamarin XAML语言教程构建ControlTemplate控件模板 (二)
- 复合五点高斯公式计算(Python实现)
- 激进or务实?HEVC、AV1 和私有Codecs现状
- SAP CRM系统里Opportunity预期销售金额和货币相关的自动转换
- React Native之函数作为参数传递给另外一个函数去调用
- servlet设置cookie实验
- 模拟驾驶能力输出,赋能客户提升稳定性信心
- Spring -Bean的作用域
- Shiro的subject实质上是当前执行用户的特定视图。
- php大转盘,php大转盘
- mysql临键锁_详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)
- NYOJ1282部分和问题--DFS剪枝入门
- 色彩的对比度和饱和度_使用高色彩对比度进行更方便的设计
- Loadrunner11破解完成添加License失败
- 计算机学拼音打字,拼音打字练习
- centos-ssh-channel is not opened.
- creo打不开stp文件_为什么stp网站打不开 creo打不开stp文件
- 操作系统知识点总结和题集大杂烩
- c语言语法生成器,C中的生成器
- 无障碍开发系列之准则及评级
热门文章
- exchange问题
- 华为手机root_免root傻瓜式操作华为手机应用精简卸载系统应用YUYU助手
- 计算机与智能化专业课程,计算机与人工智能专业方向课程大纲介绍-Artificial Intelligence 人工智能(原创)...
- ps修改dds贴图_3DsMax+PS制作发光logo
- Linux 中断处理
- H5的新特性及部分API详解
- Python爬虫笔记——BeautifulSoup模块
- OCR之:Pytesseract端到端文字识别(包含源代码以及极为详细的解释)
- 互联网用户研究调查报告PPT写法(收藏)
- ORA-01653: 表xx无法通过 8192 (在表空间 xx_data 中) 扩展