今日、振り返っするJavaSEに、一度、彼らはダイヤモンドの出力と、実際の小さな例を見ました[*]。フィギュア
* *** ***** *** *
図1
以前のロジックによると、再出力コーン以下、上記のように、最初のコーンの出力を出力の半分の半分を選択します。データを出力し、マトリックス、図2だけでなく、出力を[@]を選択し、[*]として出力し、次に出力すべき場合、[@]。
[@]になりました。ここのスペースを交換するための便利な表示が、です。
@@@ * @@@ @@ *** @@ @ ***** @ ******* @ ***** @ @@ *** @@ @@@ * @@@
図2
のコードは次の通りであります:
1 公共 静的 ボイド TEST2(INT rowC){ 2 INT I、J、K、L。 3 INT midNum = rowC / 2 + 1 。 4 のための(I = 1; I <= midNum; iは++ ){ 5 6 ため(J = 1; J <= midNum-I; J ++ ) 7 System.out.print( "@" )。 8 9 用(; K <= 2 * I-1は、k個++、K = 1 ) 10 System.out.print( "*" )。 11 12 のために(; L <= rowC-J-K + 2、L + +1 = 1 ) 13 System.out.print( "@"); 14 15 System.out.print( "の\ n" ); 16 17 } 18 19 用(i = 1; iが<= midNum-1 iは++ ){ 20 21 のために(J = 1; J <= I; J ++ ) 22 System.out.print( "@" )。 23 24 のために(K = 1; K <= rowC-2 * iは、++ k個) 25 26 System.out.print( "*" )。 27 28 のために(; L <= rowC-J-K + 2、L + +1 = 1 ) 29 System.out.print( "@" )。 30 31 System.out.println(); 32 33 } 34 }
アイデアは、最初のアルゴリズム中段、中段への最初の行から、出力を行くことです。このプロセスは、[@]の出力は、[*]、[@]、順次があるん。
最終的な出力の場合は下半分、あまりにも。あなたは文字出力、大きな変化を変更したいときには、トラブルコード、およびは、あまりにも繰り返したときで、非常にシンプルな探して、そこに発見されていません。以来、ブロガーは、少しのコードとしてそれを実装することができないアルゴリズムを持っていると思いました。
それ以来、彼は、出力内の文字の数と出力ラインとの間の関係を研究し始めた(列の数は同じことの研究のようなものです)。
最初に私は、@@@ @@@ *として所望の形状に[*]すべての出力[@]を入れ、行の周期に望んでいました。
最初のステップは、[*]番号1,3,5,7,5,3,1出力の各行を識別する。この対称形の組み合わせデータを。
出力の各ラインを見つけるための第2の工程と、[*]開始位置と終了位置します。
開始終了
1行目:44
2行目:35
3行目:26
4行目:17
5行目:26
6行目:35
7行目:44
そこには、対称シリーズの形で発見されていません。
第3のステップは、行及び上記出力の列数との関係を調べることです。
開始終了[*]の数
1行目:441
2行目:353
3行目:265
4行目:177
5行目:265
6行目:353
7行目:441
まず、(ことが判明1 = [*]数+開始- 1)端
行(2)数 - 2 * |中間列番号 - 現在の行| [*] =番号(PS:7行7は、中央の列数は4となるように| |の絶対値を表します)
(3)スタート= |中間列番号 - 現在の行| + 1
3つの方程式は、上記を要約した後、私は解決式を行ことができる感じます。
仮定は:Xは開始、Yの端部は、(主な目的は、カラムサイクルを出力することができる最終的な結果で、次いで、計算さ開始および終了位置です)
現在の行動jは、行の数は、真ん中の列番号ですmidNum
【1】Y - X + 1 = A - 2 * | midNum - J |
【2】X = | midNum - J | + 1
[2]次に、式に代入する[1] Y = Aであり、 - | midNum - J |
我々は、それぞれ、4,7、xは、yの値は、現在の行番号を決定するために使用され、midNumおよびAの値を知っています。これは、プログラムすることができます。ああ。
コードは以下の通りであります:
パブリック 静的 ボイド TEST1(INT rowC){ int型 midNum = rowC / 2 + 1 。 用(INT J = 1; J <= rowCあり、j ++ ){ ため(int型 I 1 =; I <= rowC; iが++ ){ 場合 1 +(iは> =(Math.abs(midNum-J))&&(I <=(rowC-Math.abs(midNum- J)))){ System.out.print( "*" )。 } 他{ System.out.print( "@" )。 } } のSystem.out.println(); } }
私は、最初のコードよりもはるかに少ない感じていないのです。実際には、対称数列を使用するかの知識(PS:百度と私も対称的オンライン調査を行っているシーケンスは、それが一般的な用語の式の自身の投影である、明らかになりました)。
以下に示すように、出力のそれぞれの行番号は、[*]:1,3,5,7,5,3,1は、2系列の対称算術演算単位です。用語式N現在の行番号、アイテム対称Cは、Aは、同じ値を持つ行の合計数です。添字kは、中間用語(A / 2 + 1)または(A + 1)/ 2です。