历届试题 打印十字图(模拟)

试题 历届试题 打印十字图

资源限制
时间限制: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;
}

发布了301 篇原创文章 · 获赞 38 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/tb_youth/article/details/104826918