写这道题的时候由于给出的输出样例的行和列不等比,所以没有看出来,开始想的是一圈一圈来打印,并没有想到把图像查分成几部分来打印,所以就一直卡在那里,但是对于这种距离问题,经常算错尤其是右和下这两个区域,最终根据图像一直更正得到了最终答案。其实这个就是一个找规律然后for循环打印没什么难度,但是对于我这个新老人还是困住了我一会。
代码如下图所示
#include<cstdio>
#include<iostream>
using namespace std;
char a[150][150];
void rprint(int n)
{
int len=4*n+5;
for(int i=1;i<=len;i++)
for(int j=1;j<=len;j++)
a[i][j]='.';
for(int i=len/2-1;i<=len/2+3;i++)
a[i][len/2+1]=a[len/2+1][i]='$';
//中间十字定位
for(int i=1;i<=n;i++)
{
int des1=i*2+1;
a[des1][des1]=a[des1-1][des1]=a[des1][des1-1]='$';
int des2=len-i*2;
a[des1][des2]=a[des1][des2+1]=a[des1-1][des2]='$';
a[des2][des1]=a[des2+1][des1]=a[des2][des1-1]='$';
a[des2][des2]=a[des2+1][des2]=a[des2][des2+1]='$';
}//打印每一圈的四个相对不规则的三角形的区域
for(int i=1;i<=n;i++)
{
int des=i*2+1;
for(int j=des;j<=len-i*2;j++)
{
a[i*2-1][j]='$';
a[j][i*2-1]='$';
a[len-i*2+2][j]='$';
a[j][len-i*2+2]='$';
}
}//打印规则的边的区域
for(int i=1;i<=len;i++)
{
for(int j=1;j<=len;j++)
cout<<a[i][j];
cout<<endl;
}
}
int main()
{
int n;
cin>>n;
rprint(n);
return 0;
}