历届试题 打印十字图(模拟)
生活随笔
收集整理的这篇文章主要介绍了
历届试题 打印十字图(模拟)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
试题 历届试题 打印十字图
资源限制 时间限制: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; }总结
以上是生活随笔为你收集整理的历届试题 打印十字图(模拟)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 历届试题 大臣的旅费(树的直径)
- 下一篇: 试题 历届试题 买不到的数目(dp/数学