试题 历届试题 打印十字图
资源限制
时间限制:1.0s 内存限制:256.0MB
$Daily English:
我想要提醒这个星球上的人类唯一的一件事就是:我们
依赖地球母亲生存。
The only thing I want is to awaken all humans on the planet that we are living on Mother Earth.
问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
输入格式
一个正整数 n (n<30) 表示要求打印图形的层数。
输出格式
对应包围层数的该标志。
样例输入1
1
样例输出1
..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..
样例输入2
3
样例输出2
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
提示
请仔细观察样例,尤其要注意句点的数量和输出位置。
思路:
这题有点意思(我看了好久,一开始想的太复杂导致一直不知到怎么动手!!浪费好多时间!!!好在没有放弃!!!)。最后还是被我A了!!!哈哈~(悄悄开心一会)
简单粗暴模拟(其实还是需要点脑子~):
中间十字先初始化好,然后抓住两个起点,将每一圈划分成四个部分,
每个部分,绘制每个部分需要记录方向和步数。
具体看代码~
代码:
#include <iostream>
#include <vector>
using namespace std;
char mp[150][150];
//dir: up,down,left,right:0,1,2,3
int step_x[] = {-1,1,0,0};
int step_y[] = {0,0,-1,1};
struct Point
{
int x;
int y;
Point(int xx,int yy)
{
x = xx;
y = yy;
}
};
vector<Point>vec;
//设置每一部分的方向+步数
void initVec(int *dc_d,int *dc_c)
{
if(vec.size())vec.clear();
for(int i = 0; i < 4; i++)
{
vec.push_back(Point(dc_d[i],dc_c[i]));
}
}
//绘制每一个部分
void work(int sx,int sy)
{
for(int i = 0; i < 4; i++)
{
int dir = vec[i].x;
int cnt = vec[i].y;
int xx = sx + step_x[dir];
int yy = sy + step_y[dir];
mp[xx][yy] = '$';
for(int j = 1; j < cnt; j++)
{
xx += step_x[dir];
yy += step_y[dir];
mp[xx][yy] = '$';
}
sx = xx;
sy = yy;
}
}
int main()
{
int n;
cin>>n;
//图像大小
int m = 5 + 4 * n;
//图像初始化
for(int i = 0; i < m; i++)
{
for(int j = 0; j < m; j++)
{
mp[i][j] = '.';
}
}
Point center(2*n+2,2*n+2);
//中间十字
mp[center.x][center.y] = '$';
for(int i = 0; i < 4; i++)
{
int x1 = center.x + step_x[i];
int y1 = center.y + step_y[i];
mp[x1][y1] = '$';
x1 += step_x[i];
y1 += step_y[i];
mp[x1][y1] = '$';
}
int y0 = center.y - 2,z0 = center.y + 2;
//方向
int dc_d0[] = {0,3,0,3};
int dc_d1[] = {0,2,0,2};
int dc_d2[] = {1,3,1,3};
int dc_d3[] = {1,2,1,2};
int x = 2 * n + 2;
int y = y0,z = z0;
//每圈分成4个部分
for(int i = 1; i <= n; i++)
{
//步数
int dc_c[] = {2*i,2,2,2*i};
//两个起点的列
y -= 2;
z += 2;
mp[x][y] = '$';
mp[x][z] = '$';
//左上
initVec(dc_d0,dc_c);
work(x,y);
//右上
initVec(dc_d1,dc_c);
work(x,z);
//左下
initVec(dc_d2,dc_c);
work(x,y);
//右下
initVec(dc_d3,dc_c);
work(x,z);
}
for(int i = 0; i < m; i++)
{
for(int j = 0; j < m; j++)
{
cout<<mp[i][j];
}
cout<<endl;
}
return 0;
}