5、打印图形
如下的程序会在控制台绘制分形图(就是整体与局部自相似的图形)
当 n=1,2,3 的时候,输出如下:
请仔细分析程序,并填写划线部分缺少的代码
n=1 时:
o ooo o
n=2 时:
o ooo o o o o ooooooooo o o o o ooo o
n=3 时:
o ooo o o o o ooooooooo o o o o ooo o o o o ooo ooo ooo o o o o o o o o o o o o ooooooooooooooooooooooooooo o o o o o o o o o o o o ooo ooo ooo o o o o ooo o o o o ooooooooo o o o o ooo o
填空:
public class Main { static void show(byte[][] buf) { for (int i = 0; i < buf.length; i++) { for (int j = 0; j < buf[i].length; j++) { System.out.print(buf[i][j] == 0 ? ' ' : 'o'); } System.out.println(); } } static void draw(byte[][] buf, int x, int y, int size) { if (size == 1) { buf[y][x] = 1; return; } int n = ____________; // 填空 draw(buf, x, y, n); draw(buf, x - n, y, n); draw(buf, x + n, y, n); draw(buf, x, y - n, n); draw(buf, x, y + n, n); } public static void main(String[] args) { final int N = 3; int t = 1; for (int i = 0; i < N; i++) t *= 3; byte[][] buf = new byte[t][t]; draw(buf, t / 2, t / 2, t); show(buf); } }
题解:
package test; public class demo { static void show(byte[][] buf) { for (int i = 0; i < buf.length; i++) { for (int j = 0; j < buf[i].length; j++) { System.out.print(buf[i][j] == 0 ? ' ' : 'o'); } System.out.println(); } } static void draw(byte[][] buf, int x, int y, int size) { if (size == 1) { buf[y][x] = 1; return; } int n = size / 3; // 填空 draw(buf, x, y, n); draw(buf, x - n, y, n); draw(buf, x + n, y, n); draw(buf, x, y - n, n); draw(buf, x, y + n, n); } public static void main(String[] args) { final int N = 3; int t = 1; for (int i = 0; i < N; i++) t *= 3; byte[][] buf = new byte[t][t]; draw(buf, t / 2, t / 2, t); show(buf); } }
完成:
o ooo o o o o ooooooooo o o o o ooo o o o o ooo ooo ooo o o o o o o o o o o o o ooooooooooooooooooooooooooo o o o o o o o o o o o o ooo ooo ooo o o o o ooo o o o o ooooooooo o o o o ooo o
6、打印十字图
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
输入格式
一个正整数 n (n<30) 表示要求打印图形的层数。
输出格式
对应包围层数的该标志。
样例输入
1
样例输出
样例输入
3
样例输出
package test; import java.util.Scanner; public class demo { static char[][] arr; static int s; public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt(); s = 5 + n * 4;// 观察可得,输出的均是5+n*4的矩阵 arr = new char[s][s]; for (int i = 0; i < s; i++) { for (int j = 0; j < s; j++) { arr[i][j] = '.';// 初始化矩阵 } } tian(0, s, 0); for (int i = 0; i < s; i++) { for (int j = 0; j < s; j++) { System.out.print(arr[i][j]); } System.out.println(); } } sc.close(); } // count是每次递归开始的横坐标,len是每次递归瘦两圈前的最大长度,bu是步数 private static void tian(int count, int len, int bu) { if (bu > s / 4) { // 递归次数大于s/4就退出 arr[s / 2][s / 2] = '$'; // 填补最中心的点 return; } if (count != 0) {// 不是第一圈就填上四个角 arr[count][count] = arr[count][len - 1] = arr[len - 1][count] = arr[len - 1][len - 1] = '$'; } for (int i = count + 2; i < len - 2; i++) { // 每次递归改变的第一行 arr[count][i] = arr[i][count] = arr[len - 1][i] = arr[i][len - 1] = '$'; // 每次递归改变的第二行 if (i == count + 2 || i == len - 3) { arr[count + 1][i] = arr[i][count + 1] = arr[len - 2][i] = arr[i][len - 2] = '$'; } } // count+2,len-2起到瘦两圈的效果 tian(count + 2, len - 2, bu + 1); } }