说实话真的怕这种题..
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
主要规律:
中间一个十字架固定不变。
剩下的是固定的圈,一圈一圈绕着走。
对于每一圈,直线部分很简单解决,主要是拐弯的部分。
而拐弯的部分有个很明显的特点,就是三个点。固定的。
我们以左上角的距离第i轮,左上角中间拐点的坐标 (i*2,i*2),另外两个为(i*2+1,i*2+1)(i*2+1,i*2+1);
对应的右上边就是y的减去m即可。
左下的就是x-m
右下的就是x-m,y-m;
而剩下的四条直线就更简单了。上面一根,出发点【(i-1)*2,(i*2+1)】,终点[(i-1)*x,(m-(i*2+1))]
其他的对应着来即可。
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=9+4*28+10;
int map[maxn][maxn],n,m;
int main()
{
scanf("%d",&n);
m=9+(n-1)*4;
for(int i=m/2-1;i<=m/2+3;i++)
map[m/2+1][i]=map[i][m/2+1]=1;
for(int i=1;i<=n;i++)
{
int x=i*2+1,y=2*i;
map[x][y]=map[x][y+1]=map[x-1][y+1]=1;
y=m-i*2;
map[x][y]=map[x][y+1]=map[x-1][y]=1;
x=m-i*2;
map[x][y]=map[x][y+1]=map[x+1][y]=1;
y=2*i;
map[x][y]=map[x][y+1]=map[x+1][y+1]=1;
for(int ii=i*2+1;ii<=m-i*2;ii++)
{
map[ii][(i-1)*2+1]=map[(i-1)*2+1][ii]
=map[m-(i-1)*2][ii]=map[ii][m-(i-1)*2]=1;
}
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
if(map[i][j]) printf("$");
else printf(".");
puts("");
}
return 0;
}