小明希望用星号拼凑,打印出一个大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); //打印图像
}
}