打印十字图
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见p1.jpg)
$$$$$$$$$$$$$
$ $
$$$ $$$$$$$$$ $$$
$ $ $ $
$ $$$ $$$$$ $$$ $
$ $ $ $ $ $
$ $ $$$ $ $$$ $ $
$ $ $ $ $ $ $
$ $ $ $$$$$ $ $ $
$ $ $ $ $ $ $
$ $ $$$ $ $$$ $ $
$ $ $ $ $ $
$ $$$ $$$$$ $$$ $
$ $ $ $
$$$ $$$$$$$$$ $$$
$ $
$$$$$$$$$$$$$
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数
为了能准确比对空白的数量,程序要求对行中的空白以句点(.)代替。
输入格式:
一个正整数 n (n<30) 表示要求打印图形的层数
输出:
对应包围层数的该标志。
例如:
用户输入:
1
程序应该输出:
..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..
再例如:
用户输入:
3
程序应该输出:
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
请仔细观察样例,尤其要注意句点的数量和输出位置。
资源约定:
峰值内存消耗 < 64M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
解题思路
假设要打印n层,可以分析出每多打印一层长度增加4,即n层的图形长度
m=4*n+5;
然后把图形分成二个部分考虑直线和三角
分成二部分后
第一部分三角,我们根据左上角的求得另外三个部分的坐标,这个不复杂,
左上角A(x,y), 对称的右上角B(x,m-y+1)
左下角C(m+1-x, y) 右下角D(m+1-x, m+1-y)
第二部分直线, 左直线L(x,y) , 右直线R(x, m+1-y)
上直线U(y,x), 下直线D(m+1-x, y)
打印左上三角
..$..........
..$..........
$$$.$........
....$........
..$$$.$......
......$......
....$$$......
.............
.............
.............
.............
.............
.............
根据对称打印四个方向的三角
..$.......$..
..$.......$..
$$$.$...$.$$$
....$...$....
..$$$.$.$$$..
......$......
....$$$$$....
......$......
..$$$.$.$$$..
....$...$....
$$$.$...$.$$$
..$.......$..
..$.......$..
打印四个方向的直线
...$$$$$$$...
.............
.....$$$.....
$...........$
$...........$
$.$.......$.$
$.$.......$.$
$.$.......$.$
$...........$
$...........$
.....$$$.....
.............
...$$$$$$$...
代码
package ex1.extest2;
import java.util.Scanner;
public class a02打印十字形 {
static boolean[][] arr; // 存放结果,true表示$ false 表示空格
static int m;
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
m = 5+4*N;
arr = new boolean[m+10][m+10];
int[] a = {3,3,3,2,1}; // 左上角第一个三角的横坐标
int[] b = {1,2,3,3,3};// 左上角第一个三角的纵坐标
for (int i=0; i<=N;i++) {
for (int j=0; j<5; j++) {
arr[a[j]+i*2][b[j]+i*2] = true; // 左上
arr[a[j]+i*2][m+1-b[j]-i*2] = true; // 右上
arr[m+1-a[j]-i*2][b[j]+i*2] = true; // 左下
arr[m+1-a[j]-i*2][m+1-b[j]-i*2] = true; // 右下
}
}
for (int i=0; i<=N; i++) {
for (int j=4+i*2; j<=m-3-i*2; j++) {
arr[j][1+i*2] = true; // L
arr[1+i*2][j] = true; // U
arr[j][m-i*2] = true; // R
arr[m-i*2][j] = true; // D
}
}
for (int i=1; i<=m; i++) {
for (int j=1; j<=m; j++) {
if (arr[i][j]){
System.out.print('$');
}else {
System.out.print('.');
}
}
System.out.println();
}
}
}
打完收工, %%%%%%%%
欢迎有问题的下方评论–_—