図ロス視点バレーP1058

 

大規模シミュレーション

アイデア:

初めて法律を見つけるためにテーブルをプレイ

(について慎重に考えて暴力的な手の数の後に)このような配列の導入:

//幅増加量
int型 DMの[ 4 ] = { 0042 }; // 1垂直に、スタック2つの側方、前方および後方束3スタック 
 // 長さが増加
INT DNを[ 4。 = {] 0302 }; // 1垂直に、スタックをスタック2つの側方、前方および後方束3

それは何を意味するのでしょうか?最初のケースでは、立方体の長さが高7つの文字(Y幅に対応する二次元マップ)、または6つの文字である(長さに対応する二次元マップ、すなわち、X)

示されるように、2次元地図オレンジ、ブラックのパラメータを表すパラメータは、三次元立方体を示します

 

私たちは使用し、杭3は、周りを表す1は、林立杭を表し杭横2 

我々が見つかりました。

  • 各キューブは、垂直広い二次元マップが変更されないスタックが、長さに基づいて、6 + 3になります
  • キューブ横向き各スタック、二次元マップに基づいて4〜7の上昇幅、同じ長さ
  • 二次元マップの長さおよび幅のそれぞれ前後キューブスタックは、元の2に基づいて増加されます

 

私たちは、最終的なマップを出力したいので、彼が最初に長さと幅を見つけなければならないことは明らかです

だけ横と縦の束との積層体の幅、及び2つの方法が直接入力し、nおよびmが得られることができるので、幅は、良好求めています。図ミリメートル幅の出力は、設定されています:

  MM = 7 +(N-1)* DM [3] +(M-1)* DM [2]。

そして長い間には、長いパイルフロントとリアではなく、関連するパイルアップとダウンだけでなく、同じではありません、私はYBR神々がないので、とても強いので、私は列挙することを決めました。

 

INT I = 1 ; I <= N-I ++ 
    { 
        ためINT J = 1。 J ++; J <= M 
        { 
            NN = MAX(NN、アトラス[I]、[J] * DN [ 1。 DN +] [ 3 ] *(N-I- + 1)+ 1 );
             // 長さの各点の列挙、最大値
        } 
    }

 

だから我々は、その後、図3のプロセスを検討し、長さと幅を見つけます。マップの全体のポイントを表すために使用することができ、私は左下隅を選択し、それが(行列の特定の位置に)することができ、現在の位置の左下隅を導入し、その後十分に覆わ。処理の右の順に左から前方によれば、そうカバーは第一の視点の問題に対処するために、後で来るので

 

完全なコード:

 

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <cstdlib> 
書式#include <CStringの> 
の#include < 文字列 > 
の#include <アルゴリズム> 
書式#include <cmath> 
の#include <キュー>
 使用して 名前空間はstd; 

インラインint型リード()
{ 
    int型 ANS = 0 チャー最後= '  '、CH = GETCHAR()。
    一方、(CH < ' 0 ' || CH> ' 9 ')最後= CHを、一方、(CH> = ' 0 ' && CH <= ' 9 ')ANS = ANS * 10 + CH- ' 0 '、CH = GETCHAR()。
    もし(最後== ' - ')ANS = - ANS;
    戻るANSを。
} 


int型、N Mと、

チャー S1 [ 6 ] [ 8 ] = 
{ 
    " .. + --- + " " ./ / | " " + --- + | " " | | + "" |。| / " " +···+ .. " 
;} 
//が拡幅量
のint [DMを。4 ] = { 0042 }; // 1束垂直、横2 、スタック前スタックと3後 
 // 増加の長い量
INT [DN 。4 ] {= 0302 ;} // 1垂直に、スタック2つの側方、前方および後方束3スタック。

チャー S [ 1000年 ] [ 1000 ]。

INTアトラス[ 51である ] [ 51です]。

int型MM、NN。

インラインボイド zhetizhenduliu(int型 I、int型 J、int型のx、int型のY)
{ 
    int型、B、。
    一方 - (アトラス[I] [J] 
    { 
        ための(A = 0 ; < 6 ; ++ のための(B = 0、B < 7 ; B ++ であれば(S1 [ 6 -A- 1 [B] != ' ' 
                S [X -a] [Y + B] = S1 [ 6 -A- 1] [B]。
        X - = 3 
    } 
    
    
} 

int型のmain()
{ 
    // freopenは( "drawing.in"、 "R"、STDIN)。
    // freopenは( "drawing.out"、 "W"、STDOUT)。
    N = read()は、M = read()は、
    
    int型 iは= 1 ; iが= < 1000 ; iが++ 
    { 
        ためINT J = 1 ; J <= 1000年 ; J ++ 
        { 
            S [i]は[J] = ' " ; 
        } 
    } 
    
    のためのINTi = 1 ; iは= <N; iは++ 
    { 
        ためのint型 J = 1 ; J <= Mであり、j ++ 
        { 
            アトラスは、[I] [J]。= READ(); 
        } 
    } 
    
    もし(m個の== 1 && N == 1つの &&アトラス[ 1 ] [ 1 ] == 1 ){ 
        のprintf(" .. +···+ \ N / / |。\ n + --- + | \ n | | + \ N | | / \ N + --- + .. \ N。" ); 
    } 

    MM = 7 +(N- 1)* DM [ 3 ] +(M- 1)*のDM [ 2]; // 決定された出力幅
    のためにINT I = 1 ; I <= N; I ++は
    { 
        ためINT J = 1。 ; J <= M; J ++ 
        { 
            NN = MAX(NN、アトラス[I] [ J] * DN [ 1 ] + DN [ 3 ] *(N-I- + 1)+ 1 );
             // 列挙長い各点、最大値をとる
        } 
    } 
    
    
    
    のためにint型私は= 1 ; I <= N; ++ I 
    { 
        ためINT J = 1、X、Y、J <= M; J ++ 
        {
            X = NN-DN [ 3 ] *(N- I)。
            Y軸 =のDM [ 3 ] *(NI)+ DM [ 2 ] *(J- 1)+ 1 
            zhetizhenduliu(I、J、X、Y)。
        } 
    } 
    のためのint型 I = 1 ; I <= NN iが++ 
    { 
        ためINT J = 1 ; J <= mmであり、j ++ 
        { 
            のprintf(" %のC " 、S [i]は[J])。
        } 
        プット("" )。
    } 
    
}

 

 

 

 

PS:私はあまりにもキンマだったので、いつ検査が、書き込みの練習を考える揚げ地元をカバーするので、それは上の描画問題への解決策(と私は実際には同じことを考えています)

おすすめ

転載: www.cnblogs.com/lcezych/p/11134840.html