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

AcWing 727. 菱形——像拼图一样做题

题目描述]


分析:

利用程序根据输入的整数,画出由字符*构成的该整数阶的实心菱形。给出一个示例: n = 7 n=7 n=7

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

我们将采取拆解问题,通过四个部分的组合最终拼出这个菱形。通过观察,可以看出不管给出的整数是多少,最终形成的图形一定是一由空格 和星星*构成个正方形(记为s)。如图1所示。
在这里插入图片描述

图1 正方形
#### 拼出第一部分-对角线 另外我们可以知道正方形有两条相交的对角线,它将正方形分成了四个相等的部分。如图2所示。

在这里插入图片描述

图2 对角线示意

基于此我们可以先将这两条对角线画出来,是不是就成功了一半了呢?这两条对角线也很容易画,一条线是 x = 3 ( n / 2 ) x=3(n/2) x=3(n/2),另一条是 y = n / 2 y=n/2 y=n/2。给出画对角线的代码:

	for (int i = 0; i < n; i ++) { // 画出十字架对角线for (int j = 0; j < n; j ++) {if (i == n / 2 || j == n / 2) res[i][j] = '*';}}

通过这一步画出的图形为:

      *       *       *       
* * * * * * * *       *       *       
拼出第二部分-左上角

有了这两条相交的对角线,我们只需要处理左上角需要描的点即可,然后利用相交的对角线通过关于 x x x轴对称与 y y y轴对称的方法映射到其他的三个区域!如图3所示。

在这里插入图片描述

图3 x、y映射

那么该怎么计算左上角的该描的点呢?我们可以观察这三个点的坐标 ( 1 , 2 ) , ( 2 , 1 ) , ( 2 , 2 ) {(1,2), (2,1), (2, 2)} (1,2),(2,1),(2,2),也可以表示为 ( 1 , n / 2 − 1 ) , ( 2 , 1 ) , ( 2 , n / 2 − 1 ) {(1,n/2-1), (2,1), (2, n/2-1)} (1,n/21),(2,1),(2,n/21)。因此可以用双层循环进行遍历,伪代码如下:

	// 左上角描点for (int i = 1; i <= n / 2 - 1; i ++) { // 1到n/2-1行for (int j = n / 2 - 1; j>= n / 2 - i; j --) { // 倒着来,从n/2-1到n/2-i列res[i][j] = '*';}}

经过这一步,我们所画出来的图形为:

      *       * *       * * *       
* * * * * * * *       *       *       
拼出第二部分-右上角

当我们画出左上角后,可以将 n / 2 n/2 n/2视作 y y y轴,进行关于y轴的对称实现映射效果。具体流程为:先遍历一遍左上角,遇到为*的就进行映射,只需要更改列的坐标即可,给出代码:

        for (int i = 1; i <= n / 2 - 1; i ++) { // 对称到右上角for (int j = 1; j <= n / 2 - 1; j ++) {if (res[i][j] == '*') {res[i][n / 2 + (n / 2 - j)] = res[i][j];}}}

此时生成的图形为:

      *       * * *     * * * * *   
* * * * * * * *       *       *       
接下来该怎么拼?

后面有多种拼法,可以先做左上角/右上角关于 x x x轴的对称,映射到左下角/右下角。这里我将上半部分当作一个整体,进行 x x x轴对称,一步到位!代码为:

	for (int i = 1; i <= n - 1; i ++) { // 对称到整个下方for (int j = 1; j <= n - 1; j ++) {if (res[i][j] == '*') {res[n / 2 + (n / 2 - i)][j] = res[i][j];}}}

图像为:

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

至此,菱形就被我们画出来。这道题有需要不同的画法,上面只是笔者自己的理解,关于其他更优雅更简洁的方法请大家开动脑筋去尽情尝试吧!!

代码(Java)

import java.util.*;public class Main {public static void main(String args[]) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int x = n / 2;char[][] res = new char[n][n];for (int i = 0; i < n; i ++) { // 画出十字架for (int j = 0; j < n; j ++) {if (i == n / 2 || j == n / 2) res[i][j] = '*';}}for (int i = 1; i <= n / 2 - 1; i ++) { // 左上角for (int j = n / 2 - 1; j>= n / 2 - i; j --) {res[i][j] = '*';}}for (int i = 1; i <= n / 2 - 1; i ++) { // 对称到右上角for (int j = 1; j <= n / 2 - 1; j ++) {if (res[i][j] == '*') {res[i][n / 2 + (n / 2 - j)] = res[i][j];}}}for (int i = 1; i <= n - 1; i ++) { // 对称到整个下方for (int j = 1; j <= n - 1; j ++) {if (res[i][j] == '*') {res[n / 2 + (n / 2 - i)][j] = res[i][j];}}}for (int i = 0; i < n; i ++) {for (int j = 0; j < n; j ++) {if (res[i][j] == '*') System.out.print('*');else System.out.print(' ');}System.out.println();}}
}
http://www.lryc.cn/news/321641.html

相关文章:

  • 深入理解生成型大型语言模型:自监督预训练、细调与对齐过程及其应用
  • 个人简历主页搭建系列-03:Hexo+Github Pages 介绍,框架配置
  • 【堆、位运算、数学】算法例题
  • IDEA 多个git仓库项目放一个窗口
  • 全球变暖(蓝桥杯,acwing每日一题)
  • 多数据源 - dynamic-datasource | 集成 Quartz 及 ShardingJDBC
  • 四连杆机构运动学仿真 | 【Matlab源码+理论公式文本】| 曲柄滑块 | 曲柄摇杆 | 机械连杆
  • Lightroom Classic 2024 for mac 中文激活:强大的图像后期处理软件
  • 程序员下班以后做什么副业合适?
  • HSE化工应急安全生产管理平台:衢州某巨大型化工企业的成功应用
  • 塑料工厂5G智能制造数字孪生可视化平台,推进塑料行业数字化转型
  • HTML万字学习总结
  • Linux网络编程: 以太网帧Frame/ARP/RARP详解
  • 【SpringCloud微服务实战09】Elasticsearch 搜索引擎
  • Leetcode 31. 删除无效的括号
  • 首页效果炫酷的wordpress免费主题模板
  • 网络安全的几个关键领域
  • Vue 计算属性和监视属性
  • 【Python】反编译PyInstaller打包的exe
  • 【数据结构】哈希表与哈希桶
  • 幼儿教育管理系统|基于jsp 技术+ Mysql+Java的幼儿教育管理系统设计与实现(可运行源码+数据库+设计文档)
  • 【赠书第21期】游戏力:竞技游戏设计实战教程
  • 基于VMware虚拟机安装MacOS BigSur系统
  • C++特性三:多态的基本语法及原理剖析
  • Windows下的TCP/IP实例
  • 硬件学习件Cadence day15 allegro 查看state 后发现有网络未连接怎么办, shape 有问题怎么办,
  • nginx 中 user 配置的作用
  • 愚人节礼物(C++)
  • Lua 学习
  • YOLOv7 | 添加GSConv,VoVGSCSP等多种卷积,有效提升目标检测效果,代码改进(超详细)