用$画十字
画出下面的图形:
与前面的用*画回型类似,思路都是画出组成图形每条边,组合成完整的图形,只是十字形更复杂而已,组成边数较多,总体思路是开一个合适的二维数组,把对应的位置赋值为$即可。先画十字最外边的一层,最难的是找准每条边的起始位置以及每条边的长度。
如下图所示:
图中所画的几条边是变化的,可以看出每一层都比最外层少4。
这个图中的几条短边是不变的,固定为3。
所以,画长边和短边的程序除了长度不同其他都是一样的。
每条边的起始位置也比较好找,最外层的初始位置为(0,0)。
最里层与其他是不一样的,结束递归的条件也是不一样的,最里层要比最外层提前结束。
编程代码如下:
//2017.03.29 by 迷糊狐狸
import java.util.Scanner;
public class MyWork3 {
//开一个适当的数组
static void h(int n){
n = n + 1;
char[][] cc = new char[5+4*n][5+4*n];
h(cc,0,0,1+4*n);
show(cc);
}
//画加号的每条边,找准起始位置
static void h(char[][] cc, int x, int y, int n){
if(n<=0)return;
draw_x(cc,x,y,n);
draw_x(cc,x,y+n-1,n);
draw_y(cc,x,y,n);
draw_y(cc,x+n-1,y,n);
if(n<2)return;
draw_y2(cc,x+2,y,3);
draw_y2(cc,x+n-3,y,3);
draw_x2(cc,x,y+2,3);
draw_x2(cc,x+n-3,y+2,3);
draw_x2(cc,x,y+n-3,3);
draw_x2(cc,x+n-3,y+n-3,3);
draw_y2(cc,x+2,y+n-3,3);
draw_y2(cc,x+n-3,y+n-3,3);
h(cc,x+2,y+2,n-4);
}
static void draw_x(char[][] cc, int x, int y, int len){
for(int i=2; i<len-2; i++)cc[y][x+i] = '$';
}
static void draw_y(char[][] cc, int x, int y, int len){
for(int i=2; i<len-2; i++)cc[y+i][x] = '$';
}
static void draw_x2(char[][] cc, int x, int y, int len){
for(int i=0; i<len; i++) cc[y][x+i] = '$';
}
static void draw_y2(char[][] cc, int x, int y, int len){
for(int i=0; i<len; i++)cc[y+i][x] = '$';
}
//显示数组
static void show(char[][] cc){
for(int i=0; i<cc.length; i++){
for(int j=0; j<cc[i].length; j++){
System.out.print(cc[i][j]==0? ' ' : cc[i][j]);
}
System.out.println();
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("请输入:");
while(true){
try{
int n = Integer.parseInt(scan.nextLine().trim());
if(n<1)throw new Exception();
h(n);
}catch(Exception e){
System.out.println("输入有误!");
System.out.print("请重新输入:");
}
}
}
}
程序输出结果如下:
示例1:
示例2:
示例3: