【蓝桥杯】打印十字图(C++详解)

【题目】

时间限制:1.0s 内存限制:256.0MB
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:

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

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

输入

3

输出

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

 思路分析

思路:注意观察,然后通过 层次覆盖法。

层次覆盖法:一层一层的叠加,从最外层(底层)开始;为达到十字效果,通过 两个行列 相反的 矩阵覆盖叠加 而成, 做完一个外十字做下一个十字时,需要注意缩进。

完成后大致是这个样子。蓝色部分代表 ‘ . ’ 红色部分 代表‘ $ ’

详细步骤

  • 首先把底面全部盖上 '.' (如下所示)

  • 接下来加上一层,就是加上一个红色的矩阵,盖在蓝色底上面。

继续加一层,构成一个十字。

以此类推即可完成填充。蓝色部分代表 ‘ . ’ 红色部分 代表‘ $ ’,两层轮换来填。

同时,这里还有一个小技巧!

利用对称性

矩阵 A 可以看作是 矩阵 B 的转置。因此,坐标是沿着 主对角线 对称的。

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    char map[150][150];
    cin >> n;
    
    int r = 4 * n + 5;	//矩阵长宽
    int t = n + 1;		//层的次数
    
    //填好第一层
    for(int i = 1; i <= r; i++){
        for(int j = 1; j <= r; j++){
            map[i][j] = '.';
        }
    }
    //剩下一层一层填
    for(int k = 1; k <= t; k++){
        //遍历每一层
        //以两层为一对,外层填 $ ,里层填 .
        for(int i = 1 + 2 * k; i <= r - 2 * k; i++){
            for(int j = 1 + 2 * k - 2; j <= r - (2 * k - 2); j++){
                //对称性
                map[i][j] = '$';
                map[j][i] = '$';
            }
        }
        for(int i = 1 + 2 * k + 1; i <= r - 2 * k - 1; i++){
            for(int j = 1 + 2 * k - 1; j <= r - (2 * k - 2) - 1; j++){
                //对称性
                map[i][j] = '.';
                map[j][i] = '.';
            }
        }
    }
    for(int i = 1; i <= r; i++){
        for(int j = 1; j <= r; j++){
           cout << map[i][j];
        }
        cout<<endl;
    }
    return 0;
}

总结

确实学习到了,这种方法也是第一次见,还需要多多积累。

发布了62 篇原创文章 · 获赞 34 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41960890/article/details/105154140