用$画十字
画出下面的图形:
与前面的用*画回型类似,思路都是画出组成图形每条边,组合成完整的图形,只是十字形更复杂而已,组成边数较多,总体思路是开一个合适的二维数组,把对应的位置赋值为$即可。先画十字最外边的一层,最难的是找准每条边的起始位置以及每条边的长度。
如下图所示:
图中所画的几条边是变化的,可以看出每一层都比最外层少4。
这个图中的几条短边是不变的,固定为3。
所以,画长边和短边的程序除了长度不同其他都是一样的。
每条边的起始位置也比较好找,最外层的初始位置为(0,0)。
最里层与其他是不一样的,结束递归的条件也是不一样的,最里层要比最外层提前结束。
编程代码如下:
//.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: