服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 详解C语言通过递归与非递归实现蛇形矩阵

详解C语言通过递归与非递归实现蛇形矩阵

2022-09-19 17:36诚挚的乔治 C/C++

蛇形矩阵(Snake matrix)是矩阵的一种,常被应用在编程题目与数学数列中,需要提取每条斜线里最小的数字,本篇文章将会通过递归和非递归来分别实现蛇形矩阵

前言:

本次蛇形矩阵我将以两种方法来实现,即非递归和递归

非递归的实现:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#define right 1
#define down 2
#define left 3
#define up 4
#define n 5     //控制矩形的大小
#include<stdio.h>
int main()//设计一个蛇形矩形图案 顺时针
{
    int m = 1; int x = 1; int y = 1; int direct; int i = 0;
    int j = 0;
    int arr[n + 1][n + 1];
    for (x = 1; x < (n + 1); x++)
    {
        for (y = 1; y < (n + 1); y++)
        {
            arr[x][y] = 100;//随机但是不能定为零
        }
    }
    x = 1; y = 1; direct = right;
    while (m <= n * n)
    {
        arr[x][y] = m++;
        switch (direct)
        {
        case right:
            if (arr[x][y + 1] == 100)
            {
                y++;
            }
            else
            {
                direct = down;
                x++;
            }break;
        case down:
            if (arr[x + 1][y] == 100)
            {
                x++;
            }
            else
            {
                direct = left;
                y--;
            }break;
 
        case left:
            if (arr[x][y - 1] == 100)
            {
                y--;
            }
            else
            {
                direct = up;
                x--;
            }break;
        case up:
            if (arr[x - 1][y] == 100)
            {
                x--;
            }
            else
            {
                direct = right;
                y++;
            }break;
        }
    }
    //显示矩形
    for (x = 1; x <= n; x++)
    {
        for (y = 1; y <= n; y++)
        {
            printf("%2d ", arr[x][y]);
        }
        printf("\n");
    }
    return 0;
}

非递归的解题思想:定义一个数组,这个数组的大小是(N+1)*(N+1),目的是形成一个边框,便于调整方向,其次就是当x与y跑到边框的位置就实现拐弯。

拐弯的思想就是上到下,下到左,左到上,上再到右,实现从外围向内包围,直至m <= n * n。

递归的实现:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#define right 1
#define down 2
#define left 3
#define up 4
#define n 7          //控制大小
int arr[n][n];
#include<stdio.h>
void snake(int x, int y, int m, int direct)
    {
      arr[x][y]=m;
    if (m == n * n)
        return;
    switch (direct)
    {
    case right:
        if ((y+1) == (n+1) || arr[x][y+1] > 0)
 
        {//到达右边边界或者右边有数字,不能再往右
            direct = down; //改变方向,向下
            x++; //向下移动一格
        }
        else     //可以向右填写
            y++; //向右移动一格
        break;
    case down:
        if ((x + 1) == (n+1) || arr[x + 1][y] > 0)
        {
            direct = left;
            y--;
        }
        else
            x++;
        break;
    case left:
        if ((y + 1) == (n+1) || arr[x][y - 1] > 0)
        {
            direct = up;
            x--;
        }
        else
            y--;
        break;
    case up:
        if ((y + 1) == (n+1) || arr[x-1][y] > 0)
        {
            direct = right;
            y++;
        }
        else
            x--;
        break;
    }
        snake(x, y, ++m, direct); //填写下一个数
}
int main()//用递归填写这个矩形蛇形图案
 {
    int x = 1; int y = 1; int m = 1;
    snake(x, y, m, right);
    //显示矩形
    for (x = 1; x <= n; x++)
    {
        for (y = 1; y <= n; y++)
        {
            printf("%2d ", arr[x][y]);//这里有个二,别忘了
        }
        printf("\n");
    }
    return 0;
}

递归的实现大体思路跟非递归的实现类似,从外面到内部

但递归的每一个元素是单独在一个函数里来定义的,直至最后的m==n*n,然后再main函数里实现最终的模型。

其中的n是来控制大小,例如当n为5和9的结果如下:

详解C语言通过递归与非递归实现蛇形矩阵

详解C语言通过递归与非递归实现蛇形矩阵

到此这篇关于详解C语言通过递归与非递归实现蛇形矩阵的文章就介绍到这了,更多相关C语言 蛇形矩阵内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://z-ming.blog.csdn.net/article/details/122353383

延伸 · 阅读

精彩推荐
  • C/C++C语言sqrt函数的实例用法讲解

    C语言sqrt函数的实例用法讲解

    在本篇文章里小编给大家整理的是关于C语言sqrt函数的实例内容以及用法详解,需要的朋友们可以参考下。...

    ma4511520026632021-08-13
  • C/C++C语言编程计算信噪比SNR理解学习

    C语言编程计算信噪比SNR理解学习

    这篇文章主要介绍了C语言编程信噪比SNR计算的理解学习,信噪比,英文名称叫做SNR或S/N(SIGNAL-NOISE RATIO)。是指一个电子设备或者电子系统中信号与噪声的...

    Supre_yuan4972022-01-20
  • C/C++C语言合并两个带头节点升序排列链表

    C语言合并两个带头节点升序排列链表

    这篇文章主要为大家详细介绍了C语言合并两个带头节点升序排列链表的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Judy_c11182021-07-24
  • C/C++C++ 实现双向链表的实例

    C++ 实现双向链表的实例

    这篇文章主要介绍了C++ 实现双向链表的实例的相关资料,需要的朋友可以参考下...

    typename11482021-05-24
  • C/C++C语言实现定时器控制LED灯闪烁

    C语言实现定时器控制LED灯闪烁

    这篇文章主要为大家详细介绍了C语言实现定时器控制LED灯闪烁,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    weixin_533919579482021-11-03
  • C/C++C语言实现简单的井字棋游戏

    C语言实现简单的井字棋游戏

    这篇文章主要为大家详细介绍了C语言实现简单的井字棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    肖舎5912021-11-03
  • C/C++C++采用openfilename打开文件对话框用法实例

    C++采用openfilename打开文件对话框用法实例

    这篇文章主要介绍了C++采用openfilename打开文件对话框用法实例,是C++文件操作中非常实用的技巧,需要的朋友可以参考下...

    C++教程网7902021-02-06
  • C/C++从汇编看c++中extern关键字的使用

    从汇编看c++中extern关键字的使用

    本篇文章介绍了,在c++中extern关键字的使用概述,需要的朋友参考下...

    C++教程网2892020-11-24