您的位置:首页 > 其它

【蓝桥杯】【打印十字图】

2017-11-07 10:57 197 查看
题目



小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见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] = '#';
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: