画十字

用$画十字

画出下面的图形:

与前面的用*画回型类似,思路都是画出组成图形每条边,组合成完整的图形,只是十字形更复杂而已,组成边数较多,总体思路是开一个合适的二维数组,把对应的位置赋值为$即可。先画十字最外边的一层,最难的是找准每条边的起始位置以及每条边的长度。

如下图所示:

图中所画的几条边是变化的,可以看出每一层都比最外层少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:

原文地址:https://www.cnblogs.com/liyuanba/p/2017-03-29-2.html