1

私は、指定された K、対称線を x とし、その他のものを o とする KxK 正方形を出力するアルゴリズム (プレーンな ASCII で、派手な図は使用しない) をコーディングする割り当てを与えられました。ただし、K が偶数の場合は、x の 2 つの線を使用して、水平および垂直の対称線をマークします。さらに、ソース全体で 2 つ以上のループを使用することはできません。

だから私には2つのアイデアがあります。1 つ目は、各点が満たすべき座標を分析することです。各点について、与えられた (Kx, Ky) 点が x か o かを示す方程式が必要です。いくつかのスポットを x としてマークし、他のスポットを y としてマークして、すべての可能な (Kx, Ky) を介して、いくつかの if ループと while ループを交互に配置します。これには 1 つのループが必要です。

もう 1 つのアイデアは、非常に強引ですが、すべてのポイントを分析するわけではありませんが、文字列を連結するために使用する一連の変数を用意することです。説明させてください: "height" 変数をチェックする while ループが 1 つあります (各ターンで 1 ずつ減分します)。その内部では、1 つの while ループで構成される repeatString のカスタム メソッドを使用します (指定された文字列を乗算するだけです)。 t 回)。したがって、次のようなものがあります。

while(height):
if height==maxHeight OR ==0: print repeatString("x", maxWidth)
else if height is an element of markedKy (an array telling us which Ky's to mark as x'es as the whole): print repearString("x", maxWidth)
else print "x"+(howManySpaces*" ")+"x" ["xx" if even] + (howManySpaces*" ") +"x"

...等々。私が上に書いたことは、もちろん非常に大まかで、多くのケースをカバーしていません (実際、かなりのケースをカバーしています)。ただし、この 2 番目の方法は、コードを作成するのが非常に面倒です。これがいかにバグが発生しやすいかがわかります。

3番目の最良の方法はありますか?とても簡単に思えますが、他に何も理解できません。

4

1 に答える 1

0

SINGLE ループだけを使用して実行できます... ;-)

input K
half := K / 2 , square := K * K
for pixel = 0; pixel < square; ++pixel
    horiz := pixel % K , vert := pixel / K
    if horiz = vert or horiz + vert + 1 = K // the diagonals
            or horiz = half or horiz = K - 1 - half // the middle vertical line(s)
            or vert = half or vert = K - 1 - half // the middle horizontal line(s)
        output "x"
    else if ShouldBeO(horiz + 1, vert + 1)
        output "o"
    else
        output " "
    if horiz = K - 1 // add "and vert < K - 1" if you don't want the last EOL
        output EndOfLine
end for
于 2013-08-22T21:54:57.310 に答える