历届试题 打印十字图
时间限制:1.0s 内存限制:256.0MB
问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
图形无法显示。
思路:我们会发现整个图像的上下左右的行列都是对称的,因此我们便可以找出他们前半部分中间的规律即可。
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string>
#include <sstream>
using namespace std;
char a[100][100] ;
int len,N;
void fuhang(int n,char s[])//赋n行和倒数第n列跟s[]一样的数据
{ int i;
for(i=1;i<=len;i++)
a[n][i]=s[i];
for(i=1;i<=len;i++)
a[len-n+1][i]=s[i];
}
void fulie(int m,char s[])//赋n列和倒数第n列跟s[]一样的数据
{ int i;
for(i=1;i<=len;i++)
a[i][m]=s[i];
for(i=1;i<=len;i++)
a[i][len-m+1]=s[i];
}
int main()
{
cin>>N;
int i,j,flag=0;
len=4*N+5;//确定总的行列数与n的关系
a[1][1]=a[1][2]=a[1][len]=a[1][len-1]='.';
for(i=3;i<=len-2;i++)
a[1][i]='$';
fuhang(len,a[1]);
fulie(1,a[1]);
for(i=2;i<=len/2;i++)
{ if(flag==0) //如果标记为0
{a[i][i]=a[i][len-i+1]='.'; //先‘.’后‘$’
a[i][i+1]=a[i][len-i]='$'; //后面对称
flag=1;
for(j=i+2;j<=len-i-1;j++)//然后中间都为‘.’
a[i][j]='.';
fulie(i,a[i]);//把左右列对称
fuhang(i,a[i]);//把上下行对称
}
else //与标记1相反
{ a[i][i]=a[i][len-i+1]='$';
a[i][i+1]=a[i][len-i]='.';
flag=0;
for(j=i+2;j<=len-i-1;j++)
a[i][j]='$';
fulie(i,a[i]);
fuhang(i,a[i]);
}
}
a[len/2+1][len/2+1]='$';//最中间一定是个'$'
for(i=1;i<=len;i++)
{ for(j=1;j<=len;j++)
cout<<a[i][j];
cout<<endl;
}
return 0;
}