我被派去编写一个算法输出代码(用一个简单的ascii,没有花哨的图形),对于一个给定的k,一个对称线为x的kxk正方形,其他东西为o。如果k是偶数,我们使用两行x'e来标记对称的水平线和垂直线。此外,我们不能在整个源代码中使用超过两个循环。
所以我有两个想法。首先是分析每个点应该满足的坐标-每个点应该有一个方程,告诉我们一个给定的(kx,ky)点是x还是o。我们把它放在一些if和just循环中,通过所有可能的(kx,ky)循环,将一些点标记为x,其他点标记为y。这需要一个循环。
另一个想法是,使用一组变量来连接字符串,这是非常残忍的,但并不能让我们分析所有的点让我解释一下:我们有一个while循环来检查“height”变量(每转一圈,我们都会将其减掉一个),在这个变量中,我们使用一个由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"
……等等我在上面写的当然是非常松散的,并没有涵盖很多情况(事实上,它做了不少),但我认为这可能会使我的概念不那么混乱。然而,第二种方法对代码来说是一种真正的痛苦——我现在可以看到它是多么容易出错。
有第三种,最好的方法吗我在想这个,虽然看起来很容易,而且想不出别的办法。
最佳答案
我只需要一个循环就可以做到;-)
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