使用Java输出类似Union-Jack的ASCII Art

时间:2012-10-26 12:01:37

标签: algorithm ascii

我得到了一个编程算法输出(用简单的ASCII,没有花哨的图纸),给定的K,一个KxK正方形,对称线为x,其他东西为o。但是,如果K是偶数,我们使用两行x'来标记水平和垂直对称线。而且,我们不能在整个源中使用两个以上的循环。

所以我有两个想法。第一个是分析每个点应该满足的坐标 - 每个点应该有一个等式告诉我们给定的(Kx,Ky)点是x还是o。我们把它放在一些if和while循环的交替中,通过所有可能的(Kx,Ky)将一些点标记为x,将其他点标记为y。这需要一个循环。

另一个想法,相当蛮力,但没有让我们分析所有要点,是有一组变量,然后我们用来连接字符串。让我解释一下:我们有一个while循环检查“height”变量(每一轮我们将它减1)我们在其中使用一些repeatString的自定义方法组成一个while循环(它只是乘以给定的字符串) 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"

......等等。我上面写的内容当然非常宽松,并没有涵盖很多情况(事实上,它确实有一点点),但我认为这可能会让我的概念不那么混乱。然而,第二种方法对代码来说真的很痛苦 - 我现在可以看到它容易出错。

有没有第三种,最好的方法?我对此表示不满,虽然看起来很容易,但却无法弄清楚其他任何事情。

1 个答案:

答案 0 :(得分: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