问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
输入格式
一个正整数 n (n<30) 表示要求打印图形的层数。
输出格式
对应包围层数的该标志。
样例输入1
1
样例输出1
..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..
样例输入2
3
样例输出2
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
提示
请仔细观察样例,尤其要注意句点的数量和输出位置。
图片参考自如下链接http://www.cnblogs.com/shendiao/archive/2013/05/05/3061340.html
本人的解法是,通过观察最外层的个数与输入n的关系为4n+5
一:先打印中心的十字架
二:找准4个顶点,分别找到相邻的2个点
参考答案
#include<stdio.h>
int main()
{
char a[130][130];
int n,i,j,di,dj,k,l,m;
scanf("%d",&n);
m=4*n+5;
//先都放置为‘.’
for(i=0; i<m; i++)
for(j=0; j<m; j++)
a[i][j]='.';
//打印十字形
for(i=-2; i<=2; i++) //十字架竖条
a[m/2+i][m/2]='$';
for(j=-2; j<=2; j++) //十字架横条
a[m/2][m/2+j]='$';
//为打印外围做好准备
di=0;
dj=m;
k=0;
l=m;
//打印外围上下左右的边,同时补好4角的12个方块
while(n--) //共有n个外框
{
di=di+2;
dj=dj-2;
for(i=di;i<dj;i++)
{
a[k][i]='$';
a[l-1][i]='$';
}
for(i=di;i<dj;i++)
{
a[i][k]='$';
a[i][l-1]='$';
}
//下面打印剩余边框的12个点
//首先找准4个中心点
//上左
a[k+2][k+2]='$';
a[k+2-1][k+2]='$';
a[k+2][k+2-1]='$';
//上右
a[k+2][l-2-1]='$';
a[k+2-1][l-2-1]='$';
a[k+2][l-2-1+1]='$';
//下左
a[l-2-1][k+2]='$';
a[l-2-1][k+2-1]='$';
a[l-2-1+1][k+2]='$';
//下右
a[l-2-1][l-2-1]='$';
a[l-2-1+1][l-2-1]='$';
a[l-2-1][l-2-1+1]='$';
k+=2;
l-=2;
}
//输出,每行记得换行。
for(i=0; i<m; i++)
{
for(j=0; j<m; j++)
printf("%c",a[i][j]);
printf("\n");
}
return 0;
}