棱形打印--进阶2(Java)

news2025/2/5 2:55:12

棱形打印

问题

                      *                      
                     ***                     
                    *****                    
                   *******                   
                  *********                  
                   *******                   
                    *****                    
                     ***                     
                      *                      
             *        *        *             
            ***      ***      ***            
           *****    *****    *****           
          *******  *******  *******          
         ***************************         
          *******  *******  *******          
           *****    *****    *****           
            ***      ***      ***            
             *        *        *             
    *        *        *        *        *    
   ***      ***      ***      ***      ***   
  *****    *****    *****    *****    *****  
 *******  *******  *******  *******  ******* 
*********************************************
 *******  *******  *******  *******  ******* 
  *****    *****    *****    *****    *****  
   ***      ***      ***      ***      ***   
    *        *        *        *        *    
             *        *        *             
            ***      ***      ***            
           *****    *****    *****           
          *******  *******  *******          
         ***************************         
          *******  *******  *******          
           *****    *****    *****           
            ***      ***      ***            
             *        *        *             
                      *                      
                     ***                     
                    *****                    
                   *******                   
                  *********                  
                   *******                   
                    *****                    
                     ***                     
                      *             

分析

上图的棱形打印我们可以看成是一个大棱形的每个点有变成了一个个的小棱形,我们称整体的棱形为外套棱形,外套棱形的点变成的小棱形称为内嵌棱形。

之前我们打印过单个的棱形,类似于下面的:

   *   	
  ***  	
 ***** 
*******	  -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 - 63

Process finished with exit code 0



































































本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/343898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

centos上搭建nginx视频点播服务器(nginx+vod+lua http发送鉴权消息)

需求背景&#xff1a;想着搭建一个视频点播服务器&#xff0c;最后选择了nginxvod的方案&#xff0c;用lua脚本写拉流鉴权&#xff0c;但是环境搭建过程中又发现nginxvodlua的环境并不是很容易搭建&#xff0c;是nginxlua的环境&#xff0c;手动搭建比较麻烦&#xff0c;但还是…

Numpy基础与实例——人工智能基础

文章目录一、Numpy概述1、优势2、numpy历史3、Numpy的核心&#xff1a;多维数组4、内存中的ndarray对象4.1 元数据&#xff08;metadata&#xff09;4.2 实际数据二、numpy基础1、 ndarray数组2、 arange、zeros、ones、zeros_like3、ndarray对象属性的基本操作3.1 修改数组维度…

羊了个羊游戏开发教程1:堆叠牌的拾取

本文首发于微信公众号&#xff1a; 小蚂蚁教你做游戏。欢迎关注领取更多学习做游戏的原创教程资料&#xff0c;每天学点儿游戏开发知识。嗨&#xff01;大家好&#xff0c;我是小蚂蚁。最近“羊了个羊”小游戏爆火。一下子让想做微信小游戏或者想学做微信小游戏的人多了很多&am…

Java Map集合

8 Map集合 HashMap: 元素按照键是无序&#xff0c;不重复&#xff0c;无索引&#xff0c;值不做要求 LinkedHashMap: 元素按照键是有序&#xff0c;不重复&#xff0c;无索引&#xff0c;值不做要求 8.1 Map集合概述和特点 Map集合是一种双列集合&#xff0c;每个元素包含两个…

【C++】 C C++ 内存管理

文章目录&#x1f4d5; C、C 内存分布&#x1f4d5; C 内存管理方式1. 操作内置类型2. 操作自定义类型&#x1f4d5; operator new 与 operator delete&#x1f4d5; 定位 new&#x1f4d5; C、C 内存分布 C 和 C 的内存分布没什么区别&#xff0c;C 是基于 C 语言的&#xff…

腾讯xSRC[linux+docker]搭建教程

腾讯xSRC[linuxdocker]搭建教程 1.下载镜像 docker pull xsrc/xsrc:v1.0.12.启动镜像 1️⃣启动镜像 docker run -it -d --name xsrc_web -p 60080:80 -p 63306:3306 --privilegedtrue xsrc/xsrc:v1.0.1注意将3306端口映射到8806端口&#xff0c;以便于远程连接访问容器内数…

手写识别字体的步骤是什么?怎么识别图片中的文字?

手写识别字体的步骤是什么&#xff1f;怎么识别图片中的文字&#xff1f; 1. 打开信风工具网&#xff0c;点击拍照按钮&#xff0c;选择拍图识字模式&#xff0c;对准需要识别的文件进行拍摄&#xff61;在线工具地址&#xff1a; https://ocr.bytedance.zj.cn/image/ImageT…

VScode 自定义主题颜色

vscode其实已经有很多完善且好看的主题了&#xff0c;但我总觉得每一个主题对我来说&#xff0c;都有那么一点点不够完美&#xff0c;比如亮色的主题&#xff0c;颜色就没有深色主题那么好看&#xff0c;对比度高。 好不容易看到一个好看的主题吧&#xff0c;又觉得某一部分的…

2023213-popover弹窗框中的teleported属性--Element-plus踩坑日记

popover弹窗框中的teleported属性–Element plus踩坑日记 今天在做项目时&#xff0c;有一个地方用到了弹窗框&#xff0c;但是有需求需要修改弹窗的阴影部分 比如下方的 我想对阴影进行修改&#xff0c;但是很是纳闷&#xff0c;各种标签选择器都不生效&#xff0c;很奇怪。…

使用地理定位来自定义网络钓鱼

在全球市场中&#xff0c;地理定位的能力是巨大的。 从本质上讲&#xff0c;这意味着企业可以根据收件人的位置定制广告。 纽约人可能会收到与法国人不同的广告。这使得广告对企业更有价值&#xff0c;对消费者来说更个性化。 还有另一群人想要个性化他们的产品&#xff1a;…

2023年要跟踪的11个销售管理关键指标

销售管理关键指标有&#xff1a;营销合格线索数量&#xff08;MQL&#xff09;、MQL 到 SQL 的转换率、商机赢单率、获客成本、总销售额、客户终身价值&#xff08;LTV&#xff09;、LTV 与 CAC 比率、赢单周期、每客户平均销售额&#xff08;平均客单价&#xff09;、每销售人…

全球十大资质正规现货黄金交易平台排名榜单(最新版汇总)

如今&#xff0c;在金融市场上&#xff0c;黄金已经成为公众喜爱的避险产品&#xff0c;尤其是近年来出现的现货黄金&#xff0c;这是许多朋友日常财务管理的标准。但我们在参考黄金交易平台排名进场时&#xff0c;需要留意哪些因素&#xff1f; 1、交易模式 事实上&#xf…

软件测试 -- 高阶 2 软件测试与软件开发

辅车相依&#xff0c;唇亡齿寒。-- 《左传僖公五年》 释译&#xff1a;颊骨和齿床互相依靠&#xff0c;嘴唇没有了&#xff0c;牙齿就会感到寒冷。比喻利害密要相关&#xff0c;命运紧密相关联。-- 百度百科 测试与开发是什么关系&#xff1f; 1. 软件开发流程 2. 开发和测…

AcWing 167. 木棒(DFS + 剪枝优化)

AcWing 167. 木棒&#xff08;DFS 剪枝优化&#xff09;一、问题二、分析1、整体分析2、剪枝优化&#xff08;1&#xff09;优化搜索顺序&#xff08;2&#xff09;排除等效冗余&#xff08;3&#xff09;可行性剪枝&#xff08;4&#xff09;最优性剪枝&#xff08;5&#xf…

ASEMI低压MOS管AO3401封装,AO3401图片

编辑-Z ASEMI低压MOS管AO3401参数&#xff1a; 型号&#xff1a;AO3401 封装&#xff1a;SOT-23 漏极-源极电压&#xff08;VDS&#xff09;&#xff1a;30V 栅源电压&#xff08;VGS&#xff09;&#xff1a;12V 连续漏电流&#xff08;I&#xff09;&#xff1a;4.2A …

K_A12_004 基于STM32等单片机采集人体红外感应(HC-SR501)模块串口与OLED0.96双显示

K_A12_004 基于STM32等单片机采集人体红外感应&#xff08;HC-SR501&#xff09;模块串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明模块工作原理:对应程序:四、部分代码说明1、接线引脚定义1.1、STC89C52RCHC-SR501模块1.2、STM32F103C8T6HC-SR501模块…

docker-compose概述与简单编排部署

一、Docker-compose 简介Docker-Compose项目是基于Python开发的Docker官方开源项目&#xff0c;负责实现对Docker容器集群的快速编排。Docker-Compose将所管理的容器分为三层&#xff0c;分别是 工程&#xff08;project&#xff09;&#xff0c;服务&#xff08;service&#…

MySQL学习笔记——CSDN学习记录九:数据库存储引擎

存储引擎 一、MySQL 体系结构&#xff1a; 二、存储引擎概念&#xff1a; MySQL 中的数据用于各种不同的技术存储在文件或内存。这些技术的每一个都使用不同的存储机制、索引技巧、锁定水平&#xff0c;最终提供不同的功能。通过选择不同的技术&#xff0c;能够得到更好的数据处…

03- SVC 支持向量机做人脸识别 (项目三)

数据集描述: sklearn的lfw_people函数在线下载55个外国人图片文件夹数据集来精确实现人脸识别并提取人脸特征向量数据集地址: sklearn.datasets.fetch_lfw_people — scikit-learn 1.2.1 documentationPCA降维: pca PCA(n_components0.9) 数据拆分: X_train, X_test, y_tra…

正大期货本周财经大事抢先看

美国1月CPI、Fed 等央行官员谈话 美国1月超强劲的非农就业人口&#xff0c;让投资人开始上修对这波升息循环利率顶点的预测&#xff0c;也使本周二 (14 日) 的美国 1月 CPI 格外受关注。 介绍正大国际期货主账户对比国内期货的优势 ​第一点&#xff1a;权限都在主账户 例如…