大規模シミュレーション
アイデア:
初めて法律を見つけるためにテーブルをプレイ
(について慎重に考えて暴力的な手の数の後に)このような配列の導入:
//幅増加量 int型 DMの[ 4 ] = { 0、0、4、2 }; // 1垂直に、スタック2つの側方、前方および後方束3スタック // 長さが増加 INT DNを[ 4。 = {] 0、3、0、2 }; // 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 ] = { 0、0、4、2 }; // 1束垂直、横2 、スタック前スタックと3後 // 増加の長い量 INT [DN 。4 ] {= 0、3、0、2 ;} // 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:私はあまりにもキンマだったので、いつ検査が、書き込みの練習を考える揚げ地元をカバーするので、それは上の描画問題への解決策(と私は実際には同じことを考えています)