棱形打印--进阶2(Java)
棱形打印
问题
* *** ***** ******* ********* ******* ***** *** * * * * *** *** *** ***** ***** ***** ******* ******* ******* *************************** ******* ******* ******* ***** ***** ***** *** *** *** * * * * * * * * *** *** *** *** *** ***** ***** ***** ***** ***** ******* ******* ******* ******* *******
**************************************************** ******* ******* ******* ******* ***** ***** ***** ***** ***** *** *** *** *** *** * * * * * * * * *** *** *** ***** ***** ***** ******* ******* ******* *************************** ******* ******* ******* ***** ***** ***** *** *** *** * * * * *** ***** ******* ********* ******* ***** *** *
分析
上图的棱形打印我们可以看成是一个大棱形的每个点有变成了一个个的小棱形,我们称整体的棱形为外套棱形,外套棱形的点变成的小棱形称为内嵌棱形。
之前我们打印过单个的棱形,类似于下面的:
* *** *****
******* -棱1***** *** *
像-棱1
这种的棱形打印的方法有很多,
普通棱形打法1
像初学者可能会这样做:
先打印这一行的空格
再打印这一行的
*
,然后一行行的打,这是最没有技术含量的的打法。
数理思维好一点的可能会采用下面的两种打印方法
普通棱形打法2
如上图 ,我们要打印一个半径为2的棱形,绿色的圆就是我们要在程序中用
*
代替的,我们发现所有的圆点都在四条直线上或者在四条直线的内部所以我们得到四个判断条件,只要满足这四个条件,那么这个点在我们的程序中就是
*
而不是空格
n <= x + y
x + y <= 3n
x - y >= -n
x - y <= n
所以我们写出一部分代码,用来判断这个点是否是*
public static boolean isTrue(int i ,int j ,int n){int temp = Math.abs(i-j) ;// if (( (temp) <= n ) && ( (i+j)<=(3*n) && ( n <= (i+j) )) ){ //实心棱形if (( (temp) == n ) || ( (i+j)==(3*n) || ( n == (i+j) )) ){ //空性棱形return true;}else {return false;}
}
普通棱形打法3(围点打棱)
* * *
* ==> *** *** *** * ==> ***** ***** *** ==> ******* * ***** *** *
棱心 1层 2层 3层
在 打法2 的基础上可以完成想上面的棱形打印顺序,不过打印起来需要3层for循环(不推荐),但是需要打印* * * * * * * * * * * * * * * * * * * * *
* * * * * ** * * * * * * * * * * * * * * * * * * * *
这种间隔层的棱形,就需要一层层的打。
如上图(0,0)为棱心,3为半径的一个棱形,我们会发现所有棱形内的点都满足 |x| + |y| <= 3
上面是理想状态下,下面是我们实际的控制台输出坐标模式,有时候我们的棱心坐标任意呢,依然满足上面的条件
所以我们可以写出如下代码:
//判断这个点是否是我们棱形上的点
public static boolean isOne(int i ,int j ,int x ,int y , int len){if ((Math.abs(x-i) + Math.abs(y-j) <= len)){return true;}return false;
}
本题分析
看我们本题需要打印的图形,从整体上来看,是一个大棱形;再细看大棱形都是由一个个的小棱形组成的,而且看起来小棱形就是大棱形的点,在这里,我们称大棱形叫外套棱形,小棱形叫内嵌棱形。
我们获取到外套棱形的每个点,然后对每个点实行围点打棱
这样就能打印出本题的图形了。
但是我们要知道小棱形的半径和大棱形的半径,当然一个小棱形对大棱形在我们这里只能当做一个单位看
我们假设小棱形半径为:min
大棱形半径为:max
步骤
###### 1. 确认打印这个棱形需要多大的纸(数组)
需要用到多大的纸取决于我们的最大值,就是棱形的对角线长度:
小棱形最多需要 minLen
=(2*min+1)
大棱形最多需要 (2*max+1)
所以我们的纸最小为 (2*min+1)(2*max+1)
= maxLen
int[][] array = new int[maxLen][maxLen];
2. 在数组中标记棱形的点
我们需要先找到所有小棱形的棱形,小棱形的棱形棱心与大棱形有关,如下:
如上图:红色的棱形为外套棱形的初始状态,经过变换后,外套棱形的所有点都变为小棱形(蓝色棱形),所有的蓝色棱形组合一起就变成了我们需要的大棱形
所以我们需要先建一个简单的外套棱形,然后找到简单的外套棱形与复杂棱形之间的关系
我们发现,所有外套棱形的小棱形的棱心与简单外套棱形上的点存在以下关系
小棱形半径
minR
= min小棱形直径
minD
= 2*minR
+1
变换关系
( x , y ) ===>>> (x*minD
+ minR
, y*minD
+minR
)
得到变换关系之后 ,我们可以通过外套棱形的半径max
先构建一个简单棱形,在通过变换关系将我们的纸上的所有内嵌棱形棱心标记,最后通过围点打棱
打印出问题所需要的棱形
代码
/*** @Author chen_jiapin* @Date 2023/2/13 8:45* @Version 1.0* 打印棱形 column line*/
public class PrintPrismatic {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入内嵌棱形的半径(int):");int min = sc.nextInt();System.out.println("请输入外套棱形的半径(int):");int max = sc.nextInt();int[][] array = initArr(min,max);int[][] maxArray = fun_02(max);int minD = 2*min+1;int minR = min;for (int i = 0; i < maxArray.length; i++) {for (int j = 0; j < maxArray[i].length; j++) {if (maxArray[i][j]==1){int maxX = i*minD+minR;int maxY = j*minD+minR;array[maxX][maxY]=1;fun_03(array,maxX,maxY,min);}}}print(array);}//初始化纸public static int[][] initArr(int min,int max){int minLen = min*2+1;int maxLen = (max*2+1)*minLen;int[][] array = new int[maxLen][maxLen];for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {array[i][j] = 0 ;}}return array;}//打印简单棱形方法public static int[][] fun_02(int n){int m = 2*n+1;int[][] array = new int[m][m];for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {array[i][j]=0;}}toWork(array,n);return array;}//标记纸上的点public static void fun_03(int[][] array,int x,int y,int len){array[x][y] = 1 ;for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {if (isOne(i,j,x,y,len)){array[i][j]=1;}}}}//标记简单棱形上的点public static void toWork(int[][] array ,int n){array[n][n]=1;for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {if (isOne(i,j,n,n,n)){array[i][j]=1;}}}}//判断点是否在棱形内public static boolean isOne(int i ,int j ,int x ,int y , int len){if ((Math.abs(x-i) + Math.abs(y-j) <= len)){return true;}return false;}//更具数组打印棱形public static void print(int[][] array){int line = 0;for (int i = 0; i < array.length; i++) {line++;int column = 0;for (int j = 0; j < array[i].length; j++) {column++;if (array[i][j]==1){System.out.print("*");}else System.out.print(" ");}System.out.println("\t" + column + " - " + line);}}}
控制台结果
请输入内嵌棱形的半径(int):
3
请输入外套棱形的半径(int):
4* 63 - 1*** 63 - 2***** 63 - 3******* 63 - 4***** 63 - 5*** 63 - 6* 63 - 7* * * 63 - 8*** *** *** 63 - 9***** ***** ***** 63 - 10********************* 63 - 11***** ***** ***** 63 - 12*** *** *** 63 - 13* * * 63 - 14* * * * * 63 - 15*** *** *** *** *** 63 - 16***** ***** ***** ***** ***** 63 - 17*********************************** 63 - 18***** ***** ***** ***** ***** 63 - 19*** *** *** *** *** 63 - 20* * * * * 63 - 21* * * * * * * 63 - 22*** *** *** *** *** *** *** 63 - 23***** ***** ***** ***** ***** ***** ***** 63 - 24************************************************* 63 - 25***** ***** ***** ***** ***** ***** ***** 63 - 26*** *** *** *** *** *** *** 63 - 27* * * * * * * 63 - 28* * * * * * * * * 63 - 29*** *** *** *** *** *** *** *** *** 63 - 30***** ***** ***** ***** ***** ***** ***** ***** ***** 63 - 31
*************************************************************** 63 - 32***** ***** ***** ***** ***** ***** ***** ***** ***** 63 - 33*** *** *** *** *** *** *** *** *** 63 - 34* * * * * * * * * 63 - 35* * * * * * * 63 - 36*** *** *** *** *** *** *** 63 - 37***** ***** ***** ***** ***** ***** ***** 63 - 38************************************************* 63 - 39***** ***** ***** ***** ***** ***** ***** 63 - 40*** *** *** *** *** *** *** 63 - 41* * * * * * * 63 - 42* * * * * 63 - 43*** *** *** *** *** 63 - 44***** ***** ***** ***** ***** 63 - 45*********************************** 63 - 46***** ***** ***** ***** ***** 63 - 47*** *** *** *** *** 63 - 48* * * * * 63 - 49* * * 63 - 50*** *** *** 63 - 51***** ***** ***** 63 - 52********************* 63 - 53***** ***** ***** 63 - 54*** *** *** 63 - 55* * * 63 - 56* 63 - 57*** 63 - 58***** 63 - 59******* 63 - 60***** 63 - 61*** 63 - 62* 63 - 63Process finished with exit code 0
相关文章:
棱形打印--进阶2(Java)
棱形打印 问题 * *** ***** ******* ********* ******* ***** *** * * * …...
清除 git 所有历史提交记录,使其为新库
清除 git 所有历史提交记录,使其为新库需求方案需求 基于以前的仓库重新开发,这样可保留以前的配置等文件,但是需要删除全部的历史记录、tag、分支等。 方案 创建新的分支 使用 --orphan 选项,可创建1个干净的分支(无…...
pyTorch下载和cuda下载以及学习笔记
pytorch官方网站,cuda官方网站 CUDA下载:https://developer.nvidia.com/cuda-toolkit-archive CUDNN下载:https://developer.nvidia.com/rdp/cudnn-download pytorch下载:pytorch.org 任务管理器中只显示CUDA占用的专用内存&#…...
【学习总结】IMU预积分推导
本文仅用于记录自己学习总结。记录IMU预积分推导过程,不包含具体原理。 符号表示 RRR: 表示旋转矩阵 vvv: 表示速度 ppp: 表示位移 ExpExpExp: 指数映射,将旋转向量映射为旋转矩阵 w~\widetilde{w}w: 角速度观测值 f~\widetilde{f}f: 加速度观测值 bg…...
天猫商城自动化python脚本(仅供初学者学习使用)
作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络攻防。我的…...
代码随想录第十一天(459)
文章目录459. 重复的子字符串答案思路暴力破解移动匹配459. 重复的子字符串 也不知道为啥这个提示简单题…… 答案思路 暴力破解 例如:abcabc 移位一次:cabcab 移位两次:bcabca 移位三次:abcabc 现在字符串和原字符串匹配了…...
线程及线程池学习
1 线程和进程的区别?进程:进程指正在运行的程序。线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。同一个进程中的多个线程之间可以并发的执行。2 创建线程有哪几种方式…...
SpringBoot整合(四)整合Ehcache、Redis、Memcached、jetcache、j2cache缓存
企业级应用主要作用是信息处理,当需要读取数据时,由于受限于数据库的访问效率,导致整体系统性能偏低。 为了改善上述现象,开发者通常会在应用程序与数据库之间建立一种临时的数据存储机制,该区域中的数据在内存…...
想要的古风女生头像让你快速get
如今我看到很多人都喜欢用古风女生当作头像,那么今天我就来教大家如何快速得到一张超美的古风女生头像~ 上图就是我使用 APISpace 的 AI作画(图像生成)服务 快速生成的古风女生头像,不仅可以限定颜色,还可以选择『宝石镶嵌』或『花卉造型』这…...
传统企业数字化转型,到底难在哪里?
数字化转型过程中面临最大的挑战和问题是什么?这篇整理了企业在数字化转型过程中普遍面临的9大问题和挑战以及如何解决这些问题,希望能够对各位企业数字化转型有多启发和帮助。 01 企业数字化转型三大现状 在梳理企业数字化转型问题之前,我想…...
Python:青蛙跳杯子(BFS)
题目描述 X 星球的流行宠物是青蛙,一般有两种颜色:白色和黑色。 X 星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个…...
6.10 谱分解
文章目录计算方法代码实现计算方法 单纯矩阵normal matrix指的是符号ATAAATA^TAAA^TATAAAT的矩阵,他们的特征值互异。此外,单纯矩阵还有个特点,他们的特征空间彼此正交。 对于单纯矩阵,存在以下的谱定理Spectral theorem&…...
MySQL入门篇-MySQL 行转列小结
备注:测试数据库版本为MySQL 8.0 需求:求emp表各个岗位的工资之和,如无,用0代替 如需要scott用户下建表及录入数据语句,可参考:scott建表及录入数据sql脚本 CASE语法 SELECT deptno,ifnull(sum(case when job MANAGER then sal else 0 …...
项目管理常见的十大难题及其症状
01缺少维护文档时常,项目工作紧张时,第一个去掉的就是文档工作。有时即使项目有时间,也不会创建文档;或是创建了文档,却很少在项目进行过程中维护它。症状产品与需求文档不符;技术文档过时,无法保证技术的延…...
技术方案模板
0.基本原则 1.可量化,很大、很多、很高 到底是多少?基本没影响,到底有没有影响什么情况下有影响? 2.可实施,结合实际情况最终可落地 3.可指导,非方案制定人能理解,能在尽量少的人工沟通的情况下实现方案 4.可复用,设计的方案,再次出现类似需求时可以做到少开发或不…...
MySQL中对于单表和多表的操作
一、单表查询素材: 表名:worker-- 表中字段均为中文,比如 部门号 工资 职工号 参加工作 等显示所有职工的基本信息。mysql8.0 [chap03]>select * from worker;查询所有职工所属部门的部门号,不显示重复的部门号。mysql8.0 [cha…...
MFI认证
一、什么是MFI认证? 苹果MFI认证,是苹果公司(Apple Inc.)对其授权配件厂商生产的外置配件的一种使用许可,MFi认证是apple公司Made for iPhone/iPad/iPod的英文缩写。是指分别为连接iPhone/iPad/iPod而特别设计的电子配件。 [图片] 二、iOS外设连接的几种方式 [图片] 这…...
Vue中mixins的使用
文章目录mixins介绍mixins特点mixins介绍 Mixins:在引入组件之后与组件中的对象和方法进行合并,相当于扩展了父组件的对象与方法,可以理解为形成了一个新的组件。混入 (mixins):是一种分发 Vue 组件中可复用功能的非常灵活的方式…...
【PyQt】PyQt学习(一)框架介绍+环境搭建
简介 写在最前面的话 在决定学习、使用一个框架之前需要考量如下几点: 框架运行效果;框架应用范围;框架学习成本和迁移成本;实现自己所需功能的开发效率; 只有综合考量如上四个方面,才能更好地选择适合…...
浅谈前端设计模式:策略模式和状态模式的异同点
一、策略模式 策略模式是定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 而且策略模式是重构小能力,特别适合拆分“胖逻辑”。 这个定义乍一看会有点懵,不过通过下面的例子就能慢慢理解它的意思。 先来看一个真实场景 某次活动要做…...
线性杂双功能PEG试剂OPSS-PEG-Acid,OPSS-PEG-COOH,巯基吡啶聚乙二醇羧基
英文名称:OPSS-PEG-COOH,OPSS-PEG-Acid 中文名称:巯基吡啶-聚乙二醇-羧基 OPSS-PEG-COOH是一种具有OPSS和羧基的线性杂双功能PEG试剂。它是一种有用的带有PEG间隔基的交联剂。OPSS代表正吡啶基二硫化物或邻吡啶基二硫代,与硫醇、…...
开发微服务电商项目演示(四)
一,网关服务限流熔断降级第1步:启动sentinel-dashboard控制台和Nacos注册中心服务第2步:在网关服务中引入sentinel依赖<!-- sentinel --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>sprin…...
【C语言学习笔记】:静态库
一、什么是库 库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。 本质上来说库是一种可执行代码的二进制形式,可以被操作…...
社科院与杜兰大学中外合作办学金融管理硕士——30+的年龄在职读研有必要吗?
说起读研,年龄在什么区间最合适呢?上次有位咨询的同学反馈年龄已经快35岁了,有一份不错的工作,但又不甘心止步于此,想要通过提升学历升职加薪,但又纠结自己是否能静下心来学习、是否能顺利毕业、拿到的证书…...
2.13作业【设备树解析,按自己理解】
设备树定义 设备树(device tree是描述硬件信息的一种树形结构,设备书文件在linux内核启动后被内核解析。描述一个硬件设备信息的节点我们叫做设备节点,一个设备节点内部包含当前硬件的多个不同属性,相同节点不同属性是以链式结构存…...
《NFL星计划》:巴尔的摩乌鸦·橄榄1号位
巴尔的摩乌鸦(英语:Baltimore Ravens)是一支职业美式橄榄球球队位于马里兰州的巴尔的摩。他们现时为美国美式橄榄球联合会的北区进行比赛,其主场为M&T银行体育场。乌鸦队曾在2000年和2012年取得超级碗冠军。 巴尔的摩乌鸦 成…...
Allegro如何设置自动保存和自动保存的时间操作指导
Allegro如何设置自动保存和自动保存的时间操作指导 做PCB设计的时候,自动保存软件是一个必要的功能,Allegro同样支持设置自动保存,而且可以设置自动保存的时间。 如下图 具体操作如下 点击Setup点击User Preferences...
Kotlin实现简单音乐播放器
关于音乐播放器,我真的是接触比较多,听歌作为我第一大爱好,之前也用Java设计过音乐播放器,感兴趣的同学可以阅读:Android Studio如何实现音乐播放器(简单易上手)和 Android Studio实现音乐播放器…...
ShardingSphere-Proxy 数据库协议交互解读
数据库协议对于大部分开发者来说算是比较冷门的知识,一般的用户、开发者都是通过现成的数据库客户端、驱动使用数据库,不会直接操作数据库协议。不过,对数据库协议的特点与流程有一些基本的了解,有助于开发者在排查数据库功能、性…...
基于ubuntu20.4的wine的MDK5软件的安装
本文基于ubuntu20.4安装MDK5的keil软件,由于MDK不提供linux版本的安装软件,因此需要利用wine软件来安装MDK5软件,具体流程包括wine软件安装、MDK5安装及MDK5的lic添加等3部分内容。具体流程如下所示: (一)…...
展厅设计制作/自动seo系统
CFD-POST出数据方法CFD-PSOT导出数据方法说明:本次教程包含两方面内容,导出一点的数据和导出点云的数据 (有时候在模拟过程中,需要得到一个平面的速度、压力、温度分布情况,可以在平面上按照某个规律取 个点,得到各点的…...
做网站被网警找/百度竞价推广账户优化
题目:读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的 *。 程序分析:无。 程序代码: #include<stdio.h> #include<stdlib.h> int main() {int n,i,j;pr…...
wordpress免费教程视频教程/广告网络
编辑:zero关注 搜罗最好玩的计算机视觉论文和应用,AI算法与图像处理 微信公众号,获得第一手计算机视觉相关信息本文转载自:公众号:AI公园作者:Lilian Weng编译:ronghuaiyang导读如果你和我一样&…...
通江县网站建设/旅游搜索量环比增188%
关键设置: 第一步(SQL2005、SQL2008): 开始-->程序-->Microsoft SQL Server 2008(或2005)-->配置工具-->SQL Server 配置管理器-->SQL Server网络配置-->MSSQLSERVER(这个名称以具体实例名为准) 的协议-->TCP/IP-->右键-->…...
虚拟服务器怎样做网站/自媒体推广
这篇文章主要介绍了win2008 R2设置IP安全策略后在服务器内打开网站很慢或无法访问外部网站的原因,需要的朋友可以参考下win2008R2设置IP安全策略后在服务器内打开网站很慢速度只有几KB的原因是因为IP安全策略中的关闭策略中设置了原地址“任何IP”到目标地址“任何IP”的UDP任何…...
做网站邢台/seo线上培训机构
Sqoop拉取数据到hive数据库的Parquet格式分区表问题sqoop拉取语句查询结果解决Hcatalogsqoop使用Hcatalog参数参数解释问题 在使用sqoop拉取数据到hive数据库时,如果hive中的表是parquet格式的分区表,那么虽然显示拉取数据成功,但查询数据时…...