当前位置: 首页 > news >正文

棱形打印--进阶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(围点打棱)

          * 			  *  			   *   	
*  ==>   ***			 *** 			  ***  * 	==>  	*****			 ***** 	*** 	==>  	*******	* 			 ***** 	***  	*   	
棱心		123层
在 打法2 的基础上可以完成想上面的棱形打印顺序,不过打印起来需要3for循环(不推荐),但是需要打印*       * *      *   *     *  *  *    *  * *  *   *  *   *  *  *  *  *  *  * 
*  *  * *  *  **  *  *  *  * *  *   *  *  *  * *  *   *  *  *    *   *     * *      *  
这种间隔层的棱形,就需要一层层的打。

在这里插入图片描述

如上图(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 所有历史提交记录&#xff0c;使其为新库需求方案需求 基于以前的仓库重新开发&#xff0c;这样可保留以前的配置等文件&#xff0c;但是需要删除全部的历史记录、tag、分支等。 方案 创建新的分支 使用 --orphan 选项&#xff0c;可创建1个干净的分支&#xff08;无…...

pyTorch下载和cuda下载以及学习笔记

pytorch官方网站&#xff0c;cuda官方网站 CUDA下载&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive CUDNN下载&#xff1a;https://developer.nvidia.com/rdp/cudnn-download pytorch下载&#xff1a;pytorch.org 任务管理器中只显示CUDA占用的专用内存&#…...

【学习总结】IMU预积分推导

本文仅用于记录自己学习总结。记录IMU预积分推导过程&#xff0c;不包含具体原理。 符号表示 RRR: 表示旋转矩阵 vvv: 表示速度 ppp: 表示位移 ExpExpExp: 指数映射&#xff0c;将旋转向量映射为旋转矩阵 w~\widetilde{w}w: 角速度观测值 f~\widetilde{f}f​: 加速度观测值 bg…...

天猫商城自动化python脚本(仅供初学者学习使用)

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。我的…...

代码随想录第十一天(459)

文章目录459. 重复的子字符串答案思路暴力破解移动匹配459. 重复的子字符串 也不知道为啥这个提示简单题…… 答案思路 暴力破解 例如&#xff1a;abcabc 移位一次&#xff1a;cabcab 移位两次&#xff1a;bcabca 移位三次&#xff1a;abcabc 现在字符串和原字符串匹配了…...

线程及线程池学习

1 线程和进程的区别&#xff1f;进程&#xff1a;进程指正在运行的程序。线程&#xff1a;线程是进程中的一个执行单元&#xff0c;负责当前进程中程序的执行&#xff0c;一个进程中至少有一个线程。同一个进程中的多个线程之间可以并发的执行。2 创建线程有哪几种方式&#xf…...

SpringBoot整合(四)整合Ehcache、Redis、Memcached、jetcache、j2cache缓存

​ 企业级应用主要作用是信息处理&#xff0c;当需要读取数据时&#xff0c;由于受限于数据库的访问效率&#xff0c;导致整体系统性能偏低。 ​ 为了改善上述现象&#xff0c;开发者通常会在应用程序与数据库之间建立一种临时的数据存储机制&#xff0c;该区域中的数据在内存…...

想要的古风女生头像让你快速get

如今我看到很多人都喜欢用古风女生当作头像&#xff0c;那么今天我就来教大家如何快速得到一张超美的古风女生头像~ 上图就是我使用 APISpace 的 AI作画(图像生成)服务 快速生成的古风女生头像&#xff0c;不仅可以限定颜色&#xff0c;还可以选择『宝石镶嵌』或『花卉造型』这…...

传统企业数字化转型,到底难在哪里?

数字化转型过程中面临最大的挑战和问题是什么&#xff1f;这篇整理了企业在数字化转型过程中普遍面临的9大问题和挑战以及如何解决这些问题&#xff0c;希望能够对各位企业数字化转型有多启发和帮助。 01 企业数字化转型三大现状 在梳理企业数字化转型问题之前&#xff0c;我想…...

Python:青蛙跳杯子(BFS)

题目描述 X 星球的流行宠物是青蛙&#xff0c;一般有两种颜色&#xff1a;白色和黑色。 X 星球的居民喜欢把它们放在一排茶杯里&#xff0c;这样可以观察它们跳来跳去。 如下图&#xff0c;有一排杯子&#xff0c;左边的一个是空着的&#xff0c;右边的杯子&#xff0c;每个…...

6.10 谱分解

文章目录计算方法代码实现计算方法 单纯矩阵normal matrix指的是符号ATAAATA^TAAA^TATAAAT的矩阵&#xff0c;他们的特征值互异。此外&#xff0c;单纯矩阵还有个特点&#xff0c;他们的特征空间彼此正交。   对于单纯矩阵&#xff0c;存在以下的谱定理Spectral theorem&…...

MySQL入门篇-MySQL 行转列小结

备注:测试数据库版本为MySQL 8.0 需求:求emp表各个岗位的工资之和&#xff0c;如无&#xff0c;用0代替 如需要scott用户下建表及录入数据语句&#xff0c;可参考:scott建表及录入数据sql脚本 CASE语法 SELECT deptno,ifnull(sum(case when job MANAGER then sal else 0 …...

项目管理常见的十大难题及其症状

01缺少维护文档时常&#xff0c;项目工作紧张时&#xff0c;第一个去掉的就是文档工作。有时即使项目有时间&#xff0c;也不会创建文档&#xff1b;或是创建了文档&#xff0c;却很少在项目进行过程中维护它。症状产品与需求文档不符;技术文档过时&#xff0c;无法保证技术的延…...

技术方案模板

0.基本原则 1.可量化,很大、很多、很高 到底是多少?基本没影响,到底有没有影响什么情况下有影响? 2.可实施,结合实际情况最终可落地 3.可指导,非方案制定人能理解,能在尽量少的人工沟通的情况下实现方案 4.可复用,设计的方案,再次出现类似需求时可以做到少开发或不…...

MySQL中对于单表和多表的操作

一、单表查询素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等显示所有职工的基本信息。mysql8.0 [chap03]>select * from worker;查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。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&#xff1a;在引入组件之后与组件中的对象和方法进行合并&#xff0c;相当于扩展了父组件的对象与方法&#xff0c;可以理解为形成了一个新的组件。混入 (mixins)&#xff1a;是一种分发 Vue 组件中可复用功能的非常灵活的方式…...

【PyQt】PyQt学习(一)框架介绍+环境搭建

简介 写在最前面的话 在决定学习、使用一个框架之前需要考量如下几点&#xff1a; 框架运行效果&#xff1b;框架应用范围&#xff1b;框架学习成本和迁移成本&#xff1b;实现自己所需功能的开发效率&#xff1b; 只有综合考量如上四个方面&#xff0c;才能更好地选择适合…...

浅谈前端设计模式:策略模式和状态模式的异同点

一、策略模式 策略模式是定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 而且策略模式是重构小能力&#xff0c;特别适合拆分“胖逻辑”。 这个定义乍一看会有点懵&#xff0c;不过通过下面的例子就能慢慢理解它的意思。 先来看一个真实场景 某次活动要做…...

从漏极、栅极到源极开关:手把手教你选对单端电荷泵拓扑(基于噪声与速度权衡)

从漏极、栅极到源极开关&#xff1a;单端电荷泵拓扑的噪声与速度权衡实战指南 在锁相环(PLL)设计中&#xff0c;电荷泵的性能往往成为整个系统相位噪声和杂散特性的瓶颈。特别是当设计目标同时包含低带内相位噪声和高开关速度时&#xff0c;单端电荷泵的拓扑选择就变得尤为关键…...

从零开始学习C++ -- 基础知识

C入门基础1.C的第一个程序2.命名空间2.1 namespace的价值2.2 namespace的定义2.3命名空间使用3.C输入&输出4.缺省参数5.函数重载6.引用6.1引用的概念和定义6.2引用的特性6.3引用的使用6.4const引用6.5指针和引用的关系7.inline8.nullptr1.C的第一个程序 #include <iost…...

如何快速下载Google Drive受保护PDF:终极免费解决方案指南

如何快速下载Google Drive受保护PDF&#xff1a;终极免费解决方案指南 【免费下载链接】Google-Drive-PDF-Downloader 项目地址: https://gitcode.com/gh_mirrors/go/Google-Drive-PDF-Downloader 你是否经常遇到Google Drive中那些"仅查看"权限的PDF文件&am…...

HUNYUAN-MT模型安全加固:防止API滥用与恶意攻击

HUNYUAN-MT模型安全加固&#xff1a;防止API滥用与恶意攻击 最近在帮一个朋友的公司部署他们自研的HUNYUAN-MT翻译模型API&#xff0c;准备对外开放给合作伙伴使用。本来以为就是搭个服务、配个密钥的事儿&#xff0c;结果聊下来才发现&#xff0c;他们最担心的不是模型翻译得…...

CasRel模型惊艳效果:同一实体对(马云-阿里巴巴)识别7种关系

CasRel模型惊艳效果&#xff1a;同一实体对&#xff08;马云-阿里巴巴&#xff09;识别7种关系 1. 关系抽取的神奇能力 你有没有遇到过这样的情况&#xff1a;阅读一篇关于企业家的报道时&#xff0c;想知道他和他的公司之间到底有哪些关系&#xff1f;是创始人&#xff1f;董…...

Cursor最新版0.44.11配置DeepSeek-R1模型保姆级教程(含报错解决方案)

Cursor 0.44.11深度适配DeepSeek-R1模型全流程指南 当技术爱好者第一次在Cursor中尝试调用DeepSeek-R1模型时&#xff0c;往往会遇到各种"水土不服"的情况。就像刚拿到新相机的摄影师需要调整镜头焦距一样&#xff0c;我们需要对Cursor进行精确配置才能充分发挥这个强…...

NaViL-9B部署稳定性报告:7×24小时双卡运行内存泄漏监测

NaViL-9B部署稳定性报告&#xff1a;724小时双卡运行内存泄漏监测 1. 平台概述 NaViL-9B是一款原生多模态大语言模型&#xff0c;具备纯文本问答和图片理解双重能力。该模型经过特殊优化&#xff0c;可直接复用内置模型目录&#xff0c;无需二次下载大权重文件&#xff0c;显…...

scanf_s使用避坑指南:如何正确应对C6064警告(含C6054连带问题处理)

scanf_s安全使用全指南&#xff1a;彻底解决C6064与C6054警告 在Windows平台进行C/C开发时&#xff0c;使用scanf_s函数处理用户输入是常见场景。但许多开发者都会遇到两个令人困惑的警告——C6064和C6054。这些警告看似简单&#xff0c;实则暗藏玄机。本文将带你深入理解这两个…...

春联生成模型-中文-base多线程批量生成教程,为公司百名员工定制春节祝福

春联生成模型-中文-base多线程批量生成教程&#xff0c;为公司百名员工定制春节祝福 春节将至&#xff0c;为公司员工准备个性化春联是传递祝福的好方式。传统手工创作耗时耗力&#xff0c;而春联生成模型-中文-base结合多线程技术&#xff0c;能高效完成批量定制。本文将详细…...

Phi-4-Reasoning-Vision智能助手:医疗影像图文问答系统构建实践

Phi-4-Reasoning-Vision智能助手&#xff1a;医疗影像图文问答系统构建实践 1. 项目概述 Phi-4-Reasoning-Vision是一款基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具&#xff0c;专为医疗影像分析场景优化。该系统能够理解医学影像内容并回答专业问题…...