【题目】
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见p1.jpg)
$$$$$$$$$$$$$
$ $
$$$ $$$$$$$$$ $$$
$ $ $ $
$ $$$ $$$$$ $$$ $
$ $ $ $ $ $
$ $ $$$ $ $$$ $ $
$ $ $ $ $ $ $
$ $ $ $$$$$ $ $ $
$ $ $ $ $ $ $
$ $ $$$ $ $$$ $ $
$ $ $ $ $ $
$ $$$ $$$$$ $$$ $
$ $ $ $
$$$ $$$$$$$$$ $$$
$ $
$$$$$$$$$$$$$
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
为了能准确比对空白的数量,程序要求对行中的空白以句点(.)代替。
输入格式:
一个正整数 n (n<30) 表示要求打印图形的层数
输出:
对应包围层数的该标志。
例如:
用户输入:
1
程序应该输出:
..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..
再例如:
用户输入:
3
程序应该输出:
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
请仔细观察样例,尤其要注意句点的数量和输出位置。
资源约定:
峰值内存消耗(含虚拟机) < 64M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
【分析】
需要将图形对应成二维数组,包围层数分别是1、2、3、4...时,
对应的二维数组规模是9x9、13x13、17x17、21x21...
可以发现公式,二维数组的规模数值 r = 9+(c-1)*4
内圈距离最外圈的距离是 2*(最外圈层数-该圈层数)
【源码】
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int cc = sc.nextInt();
sc.close();
int r = 9 + (cc-1)*4;
char[][] a = new char[r][r];
// setT(a);
//画中间的十字形状
for (int i = (r-1)/2-2; i <= (r-1)/2+2; i++) {
a[i][(r-1)/2] = '$';
a[(r-1)/2][i] = '$';
}
// printT(a);
//一圈一圈的画出来,先画里面的圈
for (int c = 1; c <= cc; c++) {
//关键点,把该圈距外层的距离算出来,这是一个相对量
int interval = 2*(cc-c);
for (int i = 0+interval; i < r-interval; i++) {
for (int j = 0+interval; j < r-interval; j++) {
if(a[i][j] == '$' || a[i][j] == '.'){
if(i==2+interval || i==r-3-interval){
//第三行和倒数第三行
if(j==2+interval || j==r-3-interval){
a[i][j] = '$';
}
}
continue;
}
if(i==0+interval || i==(r-1)-interval){
//第一行和最后一行
if(j>=2+interval && j<=r-3-interval){
a[i][j] = '$';
}else{
a[i][j] = '.';
}
}
if(i==1+interval || i==r-2-interval){
//第二行和倒数第二行
if(j==2+interval || j==r-3-interval){
a[i][j] = '$';
}else{
a[i][j] = '.';
}
}
if(i==2+interval || i==r-3-interval){
//第三行和倒数第三行
if(j==3+interval || j==r-4-interval){
a[i][j] = '.';
}else{
a[i][j] = '$';
}
}
if(i >2+interval && i<r-3-interval){
//其余的行
if(j==0+interval || j==r-1-interval){
a[i][j] = '$';
}else{
a[i][j] = '.';
}
}
}
}
// printT(a);
}
printT(a);
}
private static void printT(char[][] a){
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
System.out.print(a[i][j]);
}
System.out.println();
}
System.out.println("***********************************************");
}
private static void setT(char[][] a){
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
a[i][j] = '#';
}
}
}