打印十字图
时间限制:1.0s 内存限制:256.0MB
问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
输入格式
一个正整数 n (n<30) 表示要求打印图形的层数。
输出格式
对应包围层数的该标志。
样例输入1
1
样例输出1
样例输入2
3
样例输出2
提示
请仔细观察样例,尤其要注意句点的数量和输出位置。
题目网址:(http://lx.lanqiao.cn/problem.page?gpid=T25)
题意:
本题要求输入一个整数n,n为要打印图形的层数,输出十字图形。
思路:
图形中心对称图形,所以只要找到一半就行了,每加一层就会先加一层句号再加一层$,如果用c写的话太麻烦,所以用vector容器比较好。
代码:
#include<vector>
#include<string>
#include<iostream>
using namespace std;
int main()
{
vector<string> v;//定义字符串型容器
string s;
int n,i,j;
cin>>n;
v.push_back("..$$$$$..");//当n为一层的上半部分
v.push_back("..$...$..");//容器尾部扩充
v.push_back("$$$.$.$$$");
v.push_back("$...$...$");
v.push_back("$.$$$$$.$");
for(i=2;i<=n;i++)//当n大于1时增加层次
{
for(j=0;j<v.size();j++)//循环在每个字符串前后加句号
{
v[j].insert(v[j].begin(),'.');
v[j].insert(v[j].end(),'.');
}
v[0].replace(0,2,"$$");//把第一个字符串的前两个字符换掉
v[0].replace(v[0].end()-2,v[0].end(),"$$");//把第一个字符串的前两个字符换掉
for(j=0;j<3+4*(i-1);j++)//在最上面加入句号的数量
s=s+'.';
v.insert(v.begin(),s);//把字符串s添加到容器最前面
s="";//字符串清空
for(j=0;j<v.size();j++)//循环在每个字符串前后加$
{
v[j].insert(v[j].begin(),'$');
v[j].insert(v[j].end(),'$');
}
for(j=0;j<5+4*(i-1);j++)//在最上面加入$的数量
s=s+'$';
v.insert(v.begin(),s);//把字符串s添加到容器最前面
s="";
//在前两个字符串最前面和最后面各加两个句号
v[0].insert(v[0].begin(),'.');
v[0].insert(v[0].begin(),'.');
v[1].insert(v[1].begin(),'.');
v[1].insert(v[1].begin(),'.');
v[0].insert(v[0].end(),'.');
v[0].insert(v[0].end(),'.');
v[1].insert(v[1].end(),'.');
v[1].insert(v[1].end(),'.');
}
for(j=0;j<v.size();j++)//输出上半部分
cout<<v[j]<<endl;
for(j=v.size()-2;j>=0;j--)//输出下半部分
cout<<v[j]<<endl;
return 0;
}
运行结果:
总结:
这个题找到规律用自己学到的知识慢慢写就可以写出来,这个题需要耐心。