问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
..$$$$$$$$$$$$$.. ..$...........$.. $$$.$$$$$$$$$.$$$ $...$.......$...$ $.$$$.$$$$$.$$$.$ $.$...$...$...$.$ $.$.$$$.$.$$$.$.$ $.$.$...$...$.$.$ $.$.$.$$$$$.$.$.$ $.$.$...$...$.$.$ $.$.$$$.$.$$$.$.$ $.$...$...$...$.$ $.$$$.$$$$$.$$$.$ $...$.......$...$ $$$.$$$$$$$$$.$$$ ..$...........$.. ..$$$$$$$$$$$$$..
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
提示
请仔细观察样例,尤其要注意句点的数量和输出位置。
输入
一个正整数 n (n< 30) 表示要求打印图形的层数。
输出
对应包围层数的该标志。
样例输入
3
样例输出
..$$$$$$$$$$$$$.. ..$...........$.. $$$.$$$$$$$$$.$$$ $...$.......$...$ $.$$$.$$$$$.$$$.$ $.$...$...$...$.$ $.$.$$$.$.$$$.$.$ $.$.$...$...$.$.$ $.$.$.$$$$$.$.$.$ $.$.$...$...$.$.$ $.$.$$$.$.$$$.$.$ $.$...$...$...$.$ $.$$$.$$$$$.$$$.$ $...$.......$...$ $$$.$$$$$$$$$.$$$ ..$...........$.. ..$$$$$$$$$$$$$..
分析:本题输入的数量即为十字标志外环的数量,可以利用递归的方法,由大圈向小圈递归或者由小圈向大圈递归(我这里选择由大圈向小圈递归)只要递归最后满足输入数量即可。其中图中的十字大小是始终不变的,我们可以先初始化一个矩阵,宽度为(2+2*n)*2+1。然后再先初始化中间的十字(无论怎样十字是不会变的),在逐个递归外环即可。
#include<stdio.h>
char Map[300][300];//定义要输出的矩阵
int n,line;
void print(int line);
int main()
{
while(scanf("%d",&n)!=EOF){
line = (2+2*n)*2+1;
for(int i=0;i<line;i++) //初始化矩阵
for(int j=0;j<line;j++)
Map[i][j] = '.';
for(int i=0;i<5;i++)
{
Map[2*n+i][2*n+2]='$'; //无论怎样,矩阵中间的十字是
Map[2*n+2][2*n+i]='$'; //始终不变的可以先进行定义
}
print(0);//递归矩阵中的环
for(int i=0;i<line;i++)
{
for(int j=0;j<line;j++) //输出矩阵
printf("%c",Map[i][j]);
printf("\n");
}
}
}
void print(int num)
{
if(num == n) return;
for(int i =2*num+2 ; i<line-num*2-2 ;i++)
{
Map[2*num][i] = '$';
Map[line-2*num-1][i] = '$';
}
Map[2*num+1][2*num+2] = '$';
Map[2*num+1][line-2*num-3] = '$';
Map[line-2*num-2][2*num+2] = '$';
Map[line-2*num-2][line-2*num-3] = '$';
for(int i=0; i<3; i++)
{
Map[2*num+2][2*num+i] = '$';
Map[2*num+2][line-2*num-i-1] = '$';
Map[line-2*num-3][2*num+i] = '$';
Map[line-2*num-3][line-2*num-i-1] = '$';
}
for(int i=2*num+3;i<line-2*num-2;i++)
{
Map[i][2*num] = '$';
Map[i][line-2*num-1] = '$';
}
print(num+1);
}