第六届蓝桥杯 软件类省赛真题 第九题:打印大X
Posted Lee宇斌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第六届蓝桥杯 软件类省赛真题 第九题:打印大X相关的知识,希望对你有一定的参考价值。
打印大X小明希望用星号拼凑,打印出一个大X,他要求能够控制笔画的宽度和整个字的高度。
为了便于比对空格,所有的空白位置都以句点符来代替。
要求输入两个整数m n,表示笔的宽度,X的高度。用空格分开(0<m<n, 3<n<1000, 保证n是奇数)
要求输出一个大X
例如,用户输入:
3 9
程序应该输出:
***.....***
.***...***.
..***.***..
...*****...
....***....
...*****...
..***.***..
.***...***.
***.....***
(如有对齐问题,参看【图1.jpg】)
再例如,用户输入:
4 21
程序应该输出
****................****
.****..............****.
..****............****..
...****..........****...
....****........****....
.....****......****.....
......****....****......
.......****..****.......
........********........
.........******.........
..........****..........
.........******.........
........********........
.......****..****.......
......****....****......
.....****......****.....
....****........****....
...****..........****...
..****............****..
.****..............****.
****................****
(如有对齐问题,参看【图2.jpg】)
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
===============================================================
打印演示:
2 5
**..**
.****.
..**..
.****.
**..**
1 5
*...*
.*.*.
..*..
.*.*.
*...*
1 7
*.....*
.*...*.
..*.*..
...*...
..*.*..
.*...*.
*.....*
2 7
**....**
.**..**.
..****..
...**...
..****..
.**..**.
**....**
package tuxing;
import java.util.Scanner;
public class Xtu
public static void main(String[] args)
Scanner input = new Scanner(System.in);
final int ZIKUAN=input.nextInt();
final int GAO=input.nextInt();
final int KUAN=GAO-1+ZIKUAN;
//上部分
int zjDian=KUAN-ZIKUAN*2,bDian=0;
for(int i=1;i<=GAO;i++)
Dian.daDian(bDian);
Xinhao.daXin(ZIKUAN);
Dian.daDian(zjDian);
Xinhao.daXin(ZIKUAN);
Dian.daDian(bDian);
zjDian=zjDian-2;
bDian++;
System.out.println();
if(zjDian<0)
zjDian=zjDian+2;
break;
//END 中间部分
for(int i=1;i<=KUAN;i++)
int jxin=KUAN-bDian*2;
Dian.daDian(bDian);
Xinhao.daXin(jxin);
Dian.daDian(bDian);
System.out.println();
if(jxin==ZIKUAN)break;
bDian++;
//END 中下部分
for(int i=1;i<=KUAN;i++)
bDian--;
int jxin=KUAN-bDian*2;
Dian.daDian(bDian);
Xinhao.daXin(jxin);
Dian.daDian(bDian);
System.out.println();
if(jxin>=ZIKUAN*2-1)break; //尽量不要用等于,用限定范围好
//End 后部分
for(int i=1;i<=GAO;i++)
bDian--;
Dian.daDian(bDian);
Xinhao.daXin(ZIKUAN);
zjDian=zjDian+2;
Dian.daDian(zjDian);
Xinhao.daXin(ZIKUAN);
Dian.daDian(bDian);
System.out.println();
if(bDian==0)return;
//End
class Xinhao
static void daXin(int x)
for(int i=1;i<=x;i++)
System.out.print("*");
class Dian
static void daDian(int x)
for(int i=1;i<=x;i++)
System.out.print(".");
======================================================
之前写的代码太不规范了。将对他们进行调整:
package com.aiqiongdiao;
import java.util.Scanner;
public class Main
public static void main(String[] args)
Scanner input = new Scanner(System.in); //获取用户输入的数值
int ziKuan=input.nextInt(); //获取字的厚度
int gao=input.nextInt(); //获取字的高度
int kuan=gao-1+ziKuan; //计算字的宽度
int zjDian=kuan-ziKuan*2; //计算中间的点数
int bDian=0;
for(int i=1;i<=gao;i++)
daDian(bDian);
daXin(ziKuan);
daDian(zjDian);
daXin(ziKuan);
daDian(bDian);
zjDian=zjDian-2;
bDian++;
System.out.println();
if(zjDian<0)
zjDian=zjDian+2;
break;
//END 中间部分
for(int i=1;i<=kuan;i++)
int jxin=kuan-bDian*2;
daDian(bDian);
daXin(jxin);
daDian(bDian);
System.out.println();
if(jxin==ziKuan)break;
bDian++;
//END 中下部分
for(int i=1;i<=kuan;i++)
bDian--;
int jxin=kuan-bDian*2;
daDian(bDian);
daXin(jxin);
daDian(bDian);
System.out.println();
if(jxin>=ziKuan*2-1)break; //尽量不要用等于,用限定范围好
//End 后部分
for(int i=1;i<=gao;i++)
bDian--;
daDian(bDian);
daXin(ziKuan);
zjDian=zjDian+2;
daDian(zjDian);
daXin(ziKuan);
daDian(bDian);
System.out.println();
if(bDian==0)
return;
//End
public static void daXin(int ziKuan)
for(int i=1;i<=ziKuan;i++)
System.out.print("*");
private static void daDian(int bDian)
for(int i=1;i<=bDian;i++)
System.out.print(".");
感觉这种方法过于繁琐,打算再做一次简化版的,对打印题进行规范化。
=====================================================
思路:
1.获取:m n,表示宽度高度
2.计算:算出图像宽度,新建二位数组
3.背景:填充所有的点
4.函数:(左右两个)星号函数,每次打印宽度个数
5.调用:每次调用从头打到尾
优化版代码实现:
package com.aiqiongdiao;
import java.util.Scanner;
public class Main
/**
* 图案改变
* @param arr
*/
public static void gaiXin(String arr[][],int yqsd,int m)
int x=0;
int y=0;
while(true)
if(y>arr.length-1)break;
daXin(arr,m,x,y); //打印左斜
daXin(arr,m,yqsd,y); //打印右斜
y++; //头点改变
x++;
yqsd--; //注意是减减
return;
/**
* 图像打印
* @param arr
*/
public static void print(String arr[][])
for(int i=0;i<arr.length;i++)
for(int j=0;j<arr[0].length;j++)
System.out.print(arr[i][j]);
System.out.println();
/**
* 星号打印
* @param args
*/
public static void daXin(String arr[][],int m,int x,int y)
for(int i=0;i<m;i++)
arr[y][x]="*";
x++;
public static void main(String[] args)
Scanner input=new Scanner(System.in);
int m=input.nextInt(); //获取字宽度
int n=input.nextInt(); //获取高度
int kuan=n-1+m; //计算宽度
String arr[][]=new String[n][kuan];
for(int i=0;i<arr.length;i++) //填充背景
for(int j=0;j<arr[0].length;j++)
arr[i][j]=".";
int yqsd=kuan-m; //注意开始的位数调整好
gaiXin(arr,yqsd,m); //改图案图像
print(arr); //打印图像
以上是关于第六届蓝桥杯 软件类省赛真题 第九题:打印大X的主要内容,如果未能解决你的问题,请参考以下文章