您的位置:首页 > 其它

蓝桥杯 历届试题 打印十字图(模拟水题,图形输出)

2014-01-11 23:14 519 查看
历届试题 打印十字图

时间限制:1.0s 内存限制:256.0MB

问题描述

小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:

..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..


对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。

输入格式
一个正整数 n (n<30) 表示要求打印图形的层数。
输出格式
对应包围层数的该标志。
样例输入1
1
样例输出1

..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..


样例输入2

3
样例输出2

..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..


提示
请仔细观察样例,尤其要注意句点的数量和输出位置。

水题,图形输出。
代码很长,没有做优化,找到关系了就简单粗暴的输出,思路很简单,做了注释,不难看懂。
有时间会做一次优化。
牛人链接,代码很精练,看第八题:2013蓝桥杯初赛c语言专科组--题目与答案

#include <iostream>
using namespace std;
char ex[82] = "..$$$$$....$...$..$$$.$.$$$$...$...$$.$$$$$.$$...$...$$$$.$.$$$..$...$....$$$$$..";

int main()
{
int n;
while(cin>>n){
if(n==1){   //如果只有一层,则直接输出
for(int i=0;i<=80;i++){
if(i==0)
cout<<ex[i];
else if(i%9)
cout<<ex[i];
else
cout<<endl<<ex[i];
}
cout<<endl;
}
else{
ex[0]='$';
ex[8]='$';
ex[72]='$';
ex[80]='$';
//输出第一部分,即最上面两层
//第一层
for(int i=1;i<=2;i++)
cout<<'.';
for(int i=1;i<=n*4+1;i++)
cout<<'$';
for(int i=1;i<=2;i++)
cout<<'.';
cout<<endl;
//第二层
for(int i=1;i<=2;i++)
cout<<'.';
cout<<'$';
for(int i=1;i<=n*4-1;i++)
cout<<'.';
cout<<'$';
for(int i=1;i<=2;i++)
cout<<'.';
cout<<endl;
//输出第二部分,输出 (n-2)*2 层
for(int i=3;i<=(n-2)*2+2;i++){
if(i%2){    //奇数层
for(int j=1;j<=(i-3)/2;j++)
cout<<"$.";
cout<<"$$$.";
for(int j=1;j<=(n-(i-3)/2-1)*4+1;j++)
cout<<'$';
cout<<".$$$";
for(int j=1;j<=(i-3)/2;j++)
cout<<".$";
}
else{   //偶数层
for(int j=1;j<=(i-1)/2;j++)
cout<<"$.";
cout<<"..$";
for(int j=1;j<=(n-(i-3)/2-1)*4-1;j++)
cout<<'.';
cout<<"$..";
for(int j=1;j<=(i-1)/2;j++)
cout<<".$";
}
cout<<endl;
}
//输出第三部分,一共九行
for(int i=0;i<9;i++){
if(i==0 || i==8){
for(int j=1;j<=n-2;j++)
cout<<"$.";
cout<<"$$";
}
else {
for(int j=1;j<=n-1;j++)
cout<<"$.";
}
for(int j=0;j<9;j++)
cout<<ex[i*9+j];
if(i==0 || i==8){
cout<<"$$";
for(int j=1;j<=n-2;j++)
cout<<".$";
}
else {
for(int j=1;j<=n-1;j++)
cout<<".$";
}
cout<<endl;
}
//输出第四部分。拷贝了第二部分,对for循环头部做了改动。
for(int i=(n-2)*2+2;i>=3;i--){
if(i%2){    //奇数层
for(int j=1;j<=(i-3)/2;j++)
cout<<"$.";
cout<<"$$$.";
for(int j=1;j<=(n-(i-3)/2-1)*4+1;j++)
cout<<'$';
cout<<".$$$";
for(int j=1;j<=(i-3)/2;j++)
cout<<".$";
}
else{   //偶数层
for(int j=1;j<=(i-1)/2;j++)
cout<<"$.";
cout<<"..$";
for(int j=1;j<=(n-(i-3)/2-1)*4-1;j++)
cout<<'.';
cout<<"$..";
for(int j=1;j<=(i-1)/2;j++)
cout<<".$";
}
cout<<endl;
}
//输出第五部分。拷贝的第一部分,将第一层和第二层颠倒过来输出。
//第二层
for(int i=1;i<=2;i++)
cout<<'.';
cout<<'$';
for(int i=1;i<=n*4-1;i++)
cout<<'.';
cout<<'$';
for(int i=1;i<=2;i++)
cout<<'.';
cout<<endl;
//第一层
for(int i=1;i<=2;i++)
cout<<'.';
for(int i=1;i<=n*4+1;i++)
cout<<'$';
for(int i=1;i<=2;i++)
cout<<'.';
cout<<endl;
//还原
ex[0]='.';
ex[8]='.';
ex[72]='.';
ex[80]='.';
}
}
return 0;
}


Freecode : www.cnblogs.com/yym2013
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: