题目:
一开始看到这个问题的时候自己也是完全找不到头脑,而且经过仔细一想之后,这个图本身就有误导作用,因为它看起来根本就是像一个长方形,会严重影响你的思路,建议大家在草稿纸上重新把图画一下,然后你会发现这是一个正方形,并且这个图和标准正方形一样拥有四个对称轴,然后你就会发现其实不难。
我的思路是:完成它的一半,然后根据对称原则复制另半个正方形。
根据图上线索,你会发现再多层的十字图由内到外都有一个规律,依次是1,5,9,13个美元符递增4个,并且竖着的行每第一个和最后一个美元符向下产生两个符号,你会发现,当你想到这一步时,算法基本上也就可以去实现了。
以下是java算法:
import java.util.Scanner;
//打印十字
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int x = in.nextInt();
int row = 4*x+5;
int col = row;
//全部定义为.的二维字符数组
char word[][] = new char[row][col];
for(int m=0;m<row;m++) {
for(int n=0;n<col;n++) {
word[m][n]='.';
}
}
//开始改变内部结构
//1
int index = (row-3)/2;
int fi = (index+1)/2;
int finger = fi;
for(int m=0;m<index;m=m+2) {
int n=m+2;
//首个'$'符向下延伸两个‘$’
word[m+1][n] = '$';
word[m+2][n] = '$';
for(n=0+m;n<4*finger-3+m;n++) {
word[m][n+2]='$';
}
//最后一个'$'符向下延伸两个‘$’
word[m+1][n+1] = '$';
word[m+2][n+1] = '$';
finger--;
}
//2
//复原finger
finger = fi;
for(int m=0;m<index;m=m+2) {
int n=m+2;
//首个'$'符向下延伸两个‘$’
word[n][m+1] = '$';
word[n][m+2] = '$';
for(n=0+m;n<4*finger-3+m;n++) {
word[n+2][m]='$';
}
finger--;
//末尾'$'符向下延伸两个‘$’
word[n+1][m+1] = '$';
word[n+1][m+2] = '$';
}
//复制右上角部分
for(int a=0;a<(word.length+1)/2;a++) {
for(int b=0;b<(word.length+1)/2;b++) {
word[a][word.length-b-1]=word[a][b];
}
}
//以上半个二维字符数组复制下半个
for(int a=0;a<word.length;a++) {
for(int b=0;b<word.length;b++) {
word[word.length-b-1][a] = word[b][a];
}
}
//打印十字图形
for(int m=0;m<row;m++) {
for(int n=0;n<col;n++) {
System.out.print(word[m][n]);
}
System.out.println();
}
}
}
大致的步骤就是将二维数组全部元素定义为‘.’,然后通过修改内部结构完成十字图的输出。
这个算法是我脑海里第一个想到的,肯定还会有更简单的算法,有想法的小伙伴欢迎在文章下面评论交流喔。