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

2023-12-09

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

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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用递归构建螺旋方阵? 的相关文章

  • 强制枢轴项目在显示之前预加载

    我有一个带有多个 PivotItems 的 Pivot 其中一个包含一个画布 将其项目放置在动态位置 取决于数据 我获取数据 并且可以在用户选择该项目之前将这些项目放置在其位置 这不是第一个枢轴 但是 只有当我选择 PivotItem 时
  • 使用 CMake 编译时更改头文件位置会导致缺少 vtable 错误

    对于一个大型 C 项目 我需要从 qmake 过渡到 CMake 但是在处理一个玩具示例时 我遇到了一些我不理解的行为 示例代码具有单个头文件 当该头文件移动到子目录中时 我收到 MainWindow 类缺少 vtable 的错误 CMak
  • 将 SQL 保留在存储过程中与代码中的优点和缺点是什么

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动
  • 如何使 Window.Current 关闭后可见?

    我有一个可以打开新窗口的应用程序 如果原始窗口关闭 然后用户启动应用程序 例如从开始菜单 TryShowAsStandaloneAsync无法打开新窗口 为什么 所以我想 复活 原来的那个 但虽然我用Window Current Activ
  • Fortran DLL 导入

    Fortran 中有一段代码罗伯特 L 帕克和菲利普 B 斯塔克 http www stat berkeley edu 7Estark Code sbvq f FORTRAN subroutine bv key m n a b bl bu
  • 在 C 中读取字符时打印

    我正在尝试编写一个简单的小代码片段来响应箭头键按下 我知道 up 由 A 表示 并且我有以下代码来检查该序列 while 1 input char fgetc stdin if input char EOF input char n bre
  • 如何用单反斜杠替换双反斜杠

    我想用单反斜杠替换双反斜杠 Using string destinationFile System IO Path Combine msiDirectory fileName Replace gives C Hg temp LogFile
  • 为什么单击 ToolStrip 按钮两次时会引发 NullReferenceException - openFileDialog.showDialog()?

    我创建了一个干净的 Windows 窗体应用程序解决方案 添加了ToolStrip到主窗体 并在其上放置一个按钮 我还添加了一个OpenFileDialog 所以这样Click event of the ToolStripButton看起来
  • 为什么Java不支持C中的clrscr这样的函数?

    我有一个问题 对很多人来说可能听起来很愚蠢 但我不能停下来把它发布在这里 因为在互联网上找不到任何东西 为什么java没有我们在C中使用的clrscr之类的函数 如果我创建了一个基于用户输入反复迭代的 java 控制台应用程序 然后如果我想
  • 从 Web 浏览器控件读取 Javascript 变量

    我正在尝试读取从表单上的 WebBrowser 控件加载和调用的 Javascript 变量的值 Example index html 引用名为 test js 的 javascript 在 test js 上 创建并填充了几个变量 然后i
  • 通过模板参数向类添加方法

    我希望在类中拥有一个模板参数特定函数 取消启用enable if 它的名称保持不变 参数类型有所不同 尽管这应该不相关 因为只有一个被初始化 enum class MyCases CASE1 CASE2 template
  • FileMode 和 FileAccess 以及 IOException:进程无法访问文件“filename”,因为它正在被另一个进程使用

    我有一个应用程序 A 它生成一个用于跟踪的文本文件 同时 应用程序 B 需要读取相同的文本文件并附加在邮件消息中 但当应用程序 B 尝试读取文本文件时 出现以下错误 IOException 进程无法访问文件 filename 因为它 正在被
  • Tulpep PopupNotifier 无法与计时器一起使用

    using System using System Data SQLite using System Drawing using System Timers using System Windows Forms using Tulpep N
  • 将模型和订阅密钥传递给 LuisDialog,而不是通过属性

    我正在编写一个可以说两种语言的机器人 因此 我需要使用两个单独的 LUIS 应用程序 每种语言一个 Bot Framework 中的 LuisDialog 是这样初始化的 来自 Microsoft 的示例 LuisModel c413b2e
  • 对于相同的数据库对象,实体框架对象引用是否相同

    如果我从不同位置查询 逻辑上 在数据库中 相同的对象 实体框架是否返回相同的对象引用 例如 我查询了名为 Joe Black 的客户 并假设现在我知道数据库中只有一个 Joe Black Customer c select blabla w
  • ASPNET MVC - 使用具有相同签名的新助手覆盖 Html.TextBoxFor(model.property)?

    我想用我自己的助手重写 Html TextBoxFor 该助手具有完全相同的签名 当然 但名称空间不同 这是否可能 如果可以 如何实现 原因是我在现有的应用程序中有 100 多个视图 并且我想更改 TextBoxFor 的行为 以便在属性具
  • Caliburn.Micro 事件聚合器

    如果这是一个非常愚蠢的问题 请道歉 但我刚刚开始使用 caliburn micro 我正在努力获取 eventAggregator 似乎没有任何内容订阅 我不确定问题是出在视图模型还是引导程序上 这是视图模型 class MainWindo
  • 识别鼠标移动的算法

    我想知道是否有任何研究 算法可以指定鼠标在识别 等字符时的偏差量使用鼠标绘制 某种光学字符识别 但可能是一个更简单的版本 是否有某种算法可以让我说用户绘制的问号确实是一个问号 而不是其他具有一定准确性的东西 就像 Windows 平板电脑软
  • 为什么转发引用与右值引用具有相同的语法?

    我刚刚对这些 相当 新的功能做了一些研究 我想知道为什么 C 委员会决定为它们引入相同的语法 看来开发人员不必要浪费一些时间来理解它是如何工作的 而一种解决方案可以让我们思考进一步的问题 就我而言 它是从问题开始的 可以简化为 includ
  • 迭代非增量枚举

    在你问之前 我已经looked https stackoverflow com questions 261963 c iterate through an enum and looked https stackoverflow com qu

随机推荐

  • 如何在用户输入的输入类型=文本中附加%符号?

    我正在使用数字微调器 并且默认情况下我希望输入在文本框中包含 符号 我尝试使用跨度 但它在框外添加了符号 您可以使用一个简单的 css 技巧来实现这一点 只需将其添加到您的代码中即可 spinner input padding right
  • 我可以在 Unix 中运行 jshell 吗?

    我想使用expect重定向jshell输入 以便我可以在录制的演示中模拟输入 但是 尽管我可以从 Expect 脚本生成一个 jshell 进程 该进程也可以识别 jshell 提示符 但之后就没有任何效果了 期望输出看起来像控制序列 例如
  • 如何在 verilog 中不使用 while() 循环(用于综合)?

    我已经养成了开发大量测试平台并使用 for 和 while 循环进行测试的习惯 没关系 问题是我已经将这种习惯用于对应该可综合的电路进行编码 XST等拒绝合成代码 无需对合成参数进行额外修改 例如 while num lt test num
  • ImageButton 高度问题

    下午好 我正在尝试创建带有阴影的 ImageButton 要做到这一点
  • 选择 Pandas 中特定月份的行

    我有一个包含 10 多年来 12 小时数据的数据框 所有数据均按日期存储 我想提取包含特定月份数据的列 请注意 该月份不是标准的 1 2 3 格式 我的 日期 列的行如下所示 01 May 07 02 May 07 31 Oct 17 如何
  • 检索文档数据,其中条件值是子集合值

    我在 firestore 上的数据库如下所示 Candidates ID 1 likeDislikeSuper ID 1 data value n ID 2 likeDislikeSuper ID 2 data valu
  • 邻区信息不准确

    我正在尝试利用有关相邻小区的移动信息 该信息可在 Android 上通过TelephonyManager类及其getNeighboringCellInfo方法 下面我发布了完成这项工作的一部分代码 主要取自公开来源 以及该代码产生的输出的一
  • 具有变异状态的 JavaScript 日志记录对象[重复]

    这个问题在这里已经有答案了 这段 JavaScript 代码 var o console dir o o foo bar console dir o results in the same interactive tree output s
  • 如何在Android中集成Azure媒体播放器

    我有一个必须播放的清单流媒体网址 如何在android中集成azure媒体播放器来播放流视频 我找到了另一种解决方法来播放清单网址 只需连接即可 format m3u8 aapl v3 在网址末尾 您可以使用任何视频播放器播放此网址
  • 类型转换和初始化,在 Swift 中哪个更好?

    由于Swift对类型做了严格的检查 有时我们需要在NSString和String NSArray和 AnyObject 等之间进行转换 但实际上有两种不同的方法可以做到这一点 类型转换 例如str as String 初始化 比如Strin
  • 在 Angular 中取消提交表单

    我需要一个表格才能两者兼而有之 dirty并不是 submitted为了我的验证工作 我正在尝试通过 CSS 使用 ng invalid ng dirty and ng submitted由 Angular 动态添加的类 这意味着我不能简单
  • 为什么 pynput 不检测数字键盘按下?

    我在 Windows 7 上使用 python 3 7 有没有办法检测 pynput 模块中的数字 例如 1 按键 我尝试了很多其他模块 但除了 tkinter 之外我什么也没得到 它需要一个窗户 但我不想要那个 from pynput i
  • 将日期插入数据库 Postgres JDBC

    我是 Java 新手 也是 Postgres 新手 我有一个关于餐厅的小项目 我有一个像这样的 struk eng bill 表 我有一种方法可以将信息插入到该表中 如下所示 public int insertBill int id kar
  • Set-Content 在我的文件末尾附加一个换行符(换行符、CRLF)

    我的原始配置文件 web1 config 没有多余的行 在记事本中查看 显示所有字符 时看起来如下
  • xcodebuild 期间 RestKit/RestKit.h' 文件未找到错误

    我正在尝试使用 Jenkins CI 自动构建一个使用 Restkit 的 iOS 项目 显然 restkit 作为主项目中的一个项目驻留在其中 并且该项目使用 XCode IDE 成功构建 但是当我使用 xcodebuild jenkin
  • Docker 构建:无法获取档案

    我在 Windows 机器上使用 docker 工具箱 我正在尝试从 github 构建这个项目https github com pyannote pyannote video 当我通过运行构建图像时docker build t pyann
  • jQuery/Ajax 请求被发送两次

    我一遍又一遍地扫描我的代码 但似乎找不到问题 当我点击链接时 add user btn文件actions php被调用两次 因此 PHP 脚本被执行两次 这是脚本 我想它与ajax请求前面的javascript有关 function add
  • 抓住模式下方的六条线

    我有这些重复的台词 FINAL RESULTS NSTEP ENERGY RMS GMAX NAME NUMBER 1000 4 7910E 01 2 1328E 01 9 4193E 01 C 62 最终结果表示一组值的平均值 输出文件合
  • Windows $env:path ="$($env:path);。"它是在哪里添加的?

    我通过运行 解决 了一个问题 env path env path 来自 PowerShell 显然它将当前目录添加到我的路径中 请问它添加到哪个路径变量 在我的环境变量对话框中 我会在哪里看到它被添加 用户变量 系统变量 我很困惑 因为我已
  • 如何使用递归构建螺旋方阵?

    我想使用递归构建一个螺旋方阵 我可以使用迭代方法构建螺旋方阵 如下所示 void main int initial direction UP n MAX p 1 intial direction is set to UP because w