図クロス前印刷用紙(アナログ)

連続した質問の質問は、クロスの地図を印刷します

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

今日の英語を$:

私は人々に地球上で唯一の事を思い出したいのはこれです:私たちは、
生き残るために母なる地球に依存しています。
私が望む唯一のことは、目覚めている私たちは母なる地球上で生きていることを地球上のすべての人間を。

問題の説明

次のように、機構のロゴ(ないああICRC)の十字設計暁。

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

他方の側も、マークの文字の形のコンピュータのDOSウィンドウで出力する必要があり、任意の数の層を制御することができます。

入力形式

正の整数N(N <30)グラフィックスを印刷するために必要な層の数を表します。
出力フォーマット
マーカーを周囲の層の数に相当します。

サンプル入力1

1

サンプル出力1

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

サンプル入力2

3

サンプル出力2

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

ヒントは
慎重期間の出力の数と位置に特に注意して、サンプルを観察してください。

アイデア:

この問題はビット平均(私は長い時間を読んで、スタートは、私は多くの時間を無駄にする方法がわからない、あまりにも複雑だと思うように導かれました!!! !!手が幸いあきらめませんでした!)。A私は最終的にアップしました!母〜(しばらく静かに幸せ)

ブルートアナログ(又は実際には脳のビット〜):
中間クロス最初の2つの出発点をつかみ、その後、初期化され、各環のは、4つの部分に分割され
、各部分、および各セクションを記録するのに必要なステップの数の描画方向。
〜特定のコードを参照してください。

コード:

#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 ビュー30000 +

おすすめ

転載: blog.csdn.net/tb_youth/article/details/104826918