我遇到过这个非常有趣的金字塔打印数字程序。
如果n = 1,则打印以下内容,
1 2
4 3
如果n = 2,则打印以下内容,
1 2 3
8 9 4
7 6 5
如果n = 3,则打印以下内容,
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
我可以使用相当多的循环和变量打印所有这些,但它看起来非常具体。您可能已经注意到,所有这些金字塔填充都从一个方向开始,直到找到填充的路径。正如您可能已经注意到1,2,3,4,5,6,7,8,9,10,11,12在外边缘提交,直到它找到1,因此它在12之后进入第二行并打印13,14等等。它以螺旋模式打印,像蛇一样,游戏蛇继续前进,直到它自身出现。
我想知道这个金字塔生成背后是否存在任何算法,或者它只是一个耗时的金字塔生成程序。
提前致谢。这是一个非常有趣的挑战计划,所以我请求不需要投票的管道:)
答案 0 :(得分:3)
我为你的问题做了一个小的递归算法。
public int Determine(int n, int x, int y)
{
if (y == 0) return x + 1; // Top
if (x == n) return n + y + 1; // Right
if (y == n) return 3 * n - x + 1; // Bottom
if (x == 0) return 4 * n - y + 1; // Left
return 4 * n + Determine(n - 2, x - 1, y - 1);
}
您可以使用double for循环调用它。 x和y从0开始:
for (int y=0; y<=n; y++)
for (int x=0; x<=n; x++)
result[x,y] = Determine(n,x,y);
答案 1 :(得分:1)
以下是一些实现@ C.Zonnerberg提交的基本算法的C代码我的示例使用n=6
作为6x6数组。
我不得不做一些改变,以便按照我预期的方式获得输出。我交换了x's
和y's
的大部分内容,并将n's
中的几个更改为n-1
,并将for循环中的比较从<=
更改为{{1 }
<
输出
int main(){
int x,y,n;
int result[6][6];
n=6;
for (x=0; x<n; x++){
for (y=0; y<n; y++) {
result[x][y] = Determine(n,x,y);
if(y==0)
printf("\n[%d,%d] = %2d, ", x,y, result[x][y]);
else
printf("[%d,%d] = %2d, ", x,y, result[x][y]);
}
}
return 0;
}
int Determine(int n, int x, int y)
{
if (x == 0) return y + 1; // Top
if (y == n-1) return n + x; // Right
if (x == n-1) return 3 * (n-1) - y + 1; // Bottom
if (y == 0) return 4 * (n-1) - x + 1; // Left
return 4 * (n-1) + Determine(n - 2, x - 1, y- 1);
}
答案 2 :(得分:0)
使用全零数组,你可以从[row,col] = [0,0]开始,填充这个空格,然后将[0,1]添加到位置(一个在右边),直到它位于结束或进入非零。
然后向下(添加[1,0]),填入空格直到它结束或进入非零。
然后向左(添加[0,-1]),填入空格直到它结束或进入非零。
然后上升(添加[-1,0]),填入空格直到它结束或进入非零。
并重复......