当前位置: 首页 > 面试题库 >

如何使用递归建立螺旋方阵?

牧业
2023-03-14
问题内容

我想使用递归建立一个螺旋方阵。我可以使用以下迭代方法构建螺旋方阵:

void main() 
{

    int initial_direction = UP , n = MAX , p = 1 ;    /* intial_direction

    is set to UP because we need to start moving right */

    int r ,c , a[MAX][MAX];

    int row_right  = 0 , column_down = n-1 , row_left = n-1 , column_up = 0 ;

    clrscr ();

    //Set all elements of the matrix to 0

    for(r = 0 ; r < MAX ; r++) 
    { 
        for(c = 0 ; c < MAX ; c++) 
            a[r][c] = 0 ;

    }


    //Generate elements of the spiral matrix

    while(p != n*n+1) 
    {

          if(initial_direction == UP) 
          { 
            //Move RIGHT

            r = row_right++ ;

            for(c = 0 ; c < n ; c++) 
            { 
                if(a[r][c] == 0) 
                    a[r][c] = p++;

            }




            initial_direction = RIGHT ; 
          } 
          else if(initial_direction == RIGHT) 
          { 
            //Move down

            c = column_down-- ;

            for(r = 0 ; r < n ; r++) 
            {

                if(a[r][c] == 0) 
                    a[r][c] = p++; 
            }


            initial_direction = DOWN ;




          } 
          else if(initial_direction == DOWN) 
          { 
            //Move left

            r = row_left-- ;

            for(c = n-1 ; c >= 0 ; c--) 
            { 
                if(a[r][c] == 0) 
                    a[r][c] = p++;

            }

            initial_direction = LEFT ;





          } 
          else if(initial_direction == LEFT) 
          { 
            //Move up

            c = column_up++;

            for(r = n-1 ; r >= 0 ; r--) 
            {

                if(a[r][c] == 0) 
                  a[r][c] = p++;

            }


            initial_direction = UP ; 
          }

    }


    //Print the matrix

    printf("\n\n");

    for(r = 0 ; r < MAX ; r++) 
    { 
          for(c = 0 ; c < MAX ; c++) 
          printf("%4d ",a[r][c]);

          printf("\n");



    }

}

我想使用递归创建相同的矩阵:这是我使用的代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
bool s[5][5] = {0};
int counter;
typedef enum {
    right = 0,
    down,
    left,
    up
}c_flag;

c_flag flag;
int last;
int build_matrix(int a[5][5],int i,int j, c_flag flag)
{
    int ret;
    if (i < 0 || i>=5 || j < 0 || j >= 5)
    {
        if (last == right)
        {
            flag = down;
            last = flag;
        }
        if (last == down)
        {
            flag = left;
            last = flag;
        }
        if (last == left)
        {
            flag = up;
            last = flag;
        }
        if (last == up)
        {
            flag = left;
            last = flag;
        }
        return false;
    }
    if (s[i][j] == true)
    {
        if (last == right)
        {
            flag = down;
            last = flag;
        }
        if (last == down)
        {
            flag = left;
            last = flag;
        }
        if (last == left)
        {
            flag = up;
            last = flag;
        }
        if (last == up)
        {
            flag = left;
            last = flag;
        }
        return false;
    }
    if(s[i][j] == false)
    {
        s[i][j] = true;
        a[i][j] = ++ counter;
    }
    if (flag == right)
    {
        ret = build_matrix(a,i,j+1,right);
        //if (!ret)
        //  return false;
    }
    flag = down;
    last = flag;
    if (flag == down)
    {
        ret =build_matrix(a,i+1,j,down);
        //if (!ret)
        //  return false;
    }
    flag = left;
    last = flag;
    if (flag == left)
    {
        ret = build_matrix(a,i,j-1,left);
        //if (!ret)
        //  return false;
    }
    flag = up;
    last = flag;
    if (flag == up)
    {
        ret = build_matrix (a,i-1,j,up);
        //if (!ret)
        //  return false;
    }
    flag = right;
    last = flag;
    return false;
}

int main()
{
    int i, j, n = 5;
    int k, ret;
    //printf("Enter N to construct square matrix \n");
    //scanf("%d",&n);
    int a[5][5] = {0};
    k = n/2 + n%2;
    for (i = 0; i < k; i++)
    {
        ret = build_matrix(a,i,i,right);
    }
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n; j++)
            printf("%d",a[i][j]);
        printf("\n");
    }
    return 0;
}

我将上面的内容放在上面:

1 2 3 4 5

16 19 22 25 6

15 18 21 24 7

14 17 20 23 8

13 12 11 10 9

代替

1 2 3 4 5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

问题是标志未正确设置,我不知道递归调用标志在其中受到干扰。请使用递归帮助一些实现。


问题答案:
#include <stdio.h>

void build_matrix(int msize, int a[msize][msize], int size, int value){
    int i, row, col;
    if(size < 1)
        return;
    row = col = (msize - size) / 2;
    if(size==1){
        a[row][col] = value;
        return;
    }
    for(i=0;i<size-1;++i)
        a[row][col++] = value++;//RIGHT
    for(i=0;i<size-1;++i)
        a[row++][col] = value++;//DOWN
    for(i=0;i<size-1;++i)
        a[row][col--] = value++;//LEFT
    for(i=0;i<size-1;++i)
        a[row--][col] = value++;//UP
    build_matrix(msize, a, size-2, value);
}

int main(){
    int size;
    printf("input size : ");
    scanf("%d", &size);
    int a[size][size];
    build_matrix(size, a, size, 1);
    for(int r=0;r<size;++r){
        for(int c=0;c<size;++c)
            printf("%3d ", a[r][c]);
        printf("\n");
    }

    return 0;
}


 类似资料:
  • 本文向大家介绍C++递归实现螺旋数组的实例代码,包括了C++递归实现螺旋数组的实例代码的使用技巧和注意事项,需要的朋友参考一下 仅供参考,若有可改进之处,欢迎一起交流! 调试 7 8 1 2 3 4 5 6 7 8 26 27 28 29 30 31 32 9 25 44 45 46 47 48 33 10 24 43 54 55 56 49 34 11 23 42 53 52 51 50 35

  • 本文向大家介绍python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形),包括了python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)的使用技巧和注意事项,需要的朋友参考一下 插图工具使用Python内置的turtle模块,为什么叫这个turtle乌龟这个名字呢,可以这样理解,创建一个乌龟,乌龟能前进、后退、左转、右转,乌龟的尾巴朝下,它移动时就会画一条

  • 我想用一个整数的方法打印一个螺旋矩阵。然而,我在纸上的代码运行得很好,但是当我运行时,我会得到不同的数字来代替我想要的数字。 在现实中,它应该打印如下内容 如果您能帮忙,我们将不胜感激。

  • 本文向大家介绍螺旋打印矩阵,包括了螺旋打印矩阵的使用技巧和注意事项,需要的朋友参考一下 该算法用于以螺旋方式打印数组元素。首先,从第一行开始,先打印全部内容,然后按照最后一列打印,然后再最后一行,依此类推,从而以螺旋方式打印元素。  该算法的时间复杂度为O(MN),M为行数,N为列数。 输入输出 算法 输入: 矩阵矩阵,行和列m和n。 输出:以螺旋方式打印矩阵的元素。 示例 输出结果

  • 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5] 示例 2: 输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] 输出: [1,

  • 好了,现在真正有趣的事情开始了。本节,我们将创建一个旋转的3D立方体,该立方体具有不同颜色的表面。为了做到这一点,我们将介绍两类新的缓冲区——颜色缓冲区和索引缓冲区。 图9-3 旋转的立方体 操作步骤 按照以下步骤,使用WebGL创建一个旋转立方体: 1. 链接到glMatrix库和WebGL包装器: <script type="text/javascript" src="glMatrix-1.

  • 注意,本节可能会使你昏昏欲睡。本节,通过连接一系列短线,我们将绘制一条螺旋线路径。 图1-10 绘制螺旋线 绘制步骤 按照以下步骤绘制一条有圆心的螺旋线: 1. 定义2D画布并初始化螺旋参数: window.onload  = function(){ var canvas  = document.getElementById("myCanvas"); var context = can

  • 问题内容: 我有一个字符串数组列表,希望将所有可能的组合存储到另一个集合中。 例如: 重复并不重要。我现在的代码是: 我试图让它递归调用自己,以便它可以存储组合。我可以在代码中缺少什么地方或哪一部分方面获得任何帮助吗? 问题答案: 鉴于这是家庭作业,因此我将尝试为您提供答案的背景。 解决此问题的关键是使用递归。 首先,假设您的数组中有两个项目。您可以删除第一个项目以得到您的第一个组合。将其余项添加