zoukankan      html  css  js  c++  java
  • 画十字

    用$画十字

    画出下面的图形:

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

    如下图所示:

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

  • 相关阅读:
    Python常用函数
    MySQL常用操作
    Python与JAVA的异同
    token
    用户cookie和会话session、sessionID的关系
    Jenkins应用
    Python3 logging模块
    python 多线程threading模块
    引用的声明周期结束时,并不会调用析构函数,只有本体的声明周期结束时,才会调用析构函数
    行为像指针的类的对象每次作为参数传入函数或者传出函数时都要小心
  • 原文地址:https://www.cnblogs.com/liyuanba/p/2017-03-29-2.html
Copyright © 2011-2022 走看看