做练习题的网站,媒体软文推广平台,单位的网站怎样设计才美观,福州盈科网站建设有限公司怎么样题目描述] 分析#xff1a;
利用程序根据输入的整数#xff0c;画出由字符*构成的该整数阶的实心菱形。给出一个示例#xff1a; n 7 n7 n7。 * * * * * * * * *
* * * * * * * * * * * * * * * * 我们将采取拆解问题#xff0c;通过四个部分的…题目描述] 分析
利用程序根据输入的整数画出由字符*构成的该整数阶的实心菱形。给出一个示例 n 7 n7 n7。 * * * * * * * * *
* * * * * * * * * * * * * * * * 我们将采取拆解问题通过四个部分的组合最终拼出这个菱形。通过观察可以看出不管给出的整数是多少最终形成的图形一定是一由空格 和星星*构成个正方形记为s。如图1所示。
图1 正方形 #### 拼出第一部分-对角线 另外我们可以知道正方形有两条相交的对角线它将正方形分成了四个相等的部分。如图2所示。 图2 对角线示意 基于此我们可以先将这两条对角线画出来是不是就成功了一半了呢这两条对角线也很容易画一条线是 x 3 ( n / 2 ) x3(n/2) x3(n/2)另一条是 y n / 2 yn/2 yn/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/2−1),(2,1),(2,n/2−1)。因此可以用双层循环进行遍历伪代码如下 // 左上角描点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();}}
}