C++ 程序打印数字螺旋图案

c++server side programmingprogramming更新于 2024/11/2 5:54:00

以不同格式显示数字属于基本编码问题,用于学习不同的编码概念,如条件语句和循环语句。在不同的程序中,我们打印特殊字符,如星号,以制作三角形或正方形。在本文中,我们将使用 C++ 以正方形等螺旋形式打印数字。

我们将行数 n 作为输入,然后从左上角开始向右移动,然后向下,然后向左,然后向上,然后再次向右移动,依此类推。

带数字的螺旋图案

1   2   3   4   5   6   7
24  25  26  27  28  29  8
23  40  41  42  43  30  9
22  39  48  49  44  31  10
21  38  47  46  45  32  11
20  37  36  35  34  33  12
19  18  17  16  15  14  13

为了解决这个问题,我们将使用一个大小为 n x n 的二维矩阵,在这个例子中,我们取 n = 7。然后以螺旋方式从左上角填充矩阵。最后打印整个矩阵。在这里,我们在第一行打印从 1 到 7,然后流程改变方向,向下移动到 13,然后再向左移动到 19,最后向上移动到 24,然后再向右,依此类推。让我们看一下算法以便更好地理解。

算法

  • 将输入 s 作为行数
  • 创建一个 s x s 矩阵并用 0 初始化它们
  • num := 1
  • 用 0 初始化 i、j、m
  • 初始化 n := s - 1、p := 0 和 q := s - 1
  • 当 num 不超过 s * s 时,执行
    • 对于从 p 到 q 的 j,执行
      • mat[ m, j ] := num
      • num := num + 1
    • end for
    • m := m + 1
    • 对于从 m 到 n 的 i,执行
      • mat[ i, q ] := num
      • num := num + 1
    • end for
    • q := q - 1
    • 对于从 q 到 p 的 j,将 j 减少 1,执行
      • mat[ n, j ] := num
      • num := num + 1
    • end for
    • n := n - 1
    • 对于从 n 到 m 的 i,将 i 减少 1,执行
      • mat[ i, p ] := num
      • num := num + 1
    • end for
    • p := p + 1
  • end while
  • 对于 i 从 0 到 s - 1 的范围,执行
    • 对于 j 从 0 到 s - 1 的范围,执行
      • display mat[ i, j ]
    • end for
    • 将光标移到下一行
  • end for

示例

#include <iostream>
using namespace std;
void solve( int s ){
    int mat[ s ][ s ] = {0};
    int i, j, m, n, p, q, num;
    num = 1; // 从 1 开始计数
    i = 0;
    j = 0;
    m = 0; // 行索引下限
    n = s - 1; // 行索引上限
    p = 0; // 列索引下限
    q = s - 1; // 列索引上限
    while ( num <= s * s ) {
   
        // 从左到右水平放置数字
        for ( j = p; j <= q; j++ ) {
            mat[ m ][ j ] = num;
            num = num + 1;
        }
        m = m + 1;
        
        // 从上到下垂直填充
        for ( i = m; i <= n; i++ ) {
            mat[ i ][ q ] = num;
            num = num + 1;
        }
        q = q - 1;
        
        // 从右到左水平填充
        for ( j = q; j >= p; j-- ) {
            mat[ n ][ j ] = num;
            num = num + 1;
        }
        n = n - 1;
        
        // 从下到上垂直填充
        for ( i = n; i >= m; i-- ) {
            mat[ i ][ p ] = num;
            num++;
        }
        p = p + 1;
   }

   // display the mat
   for ( i = 0; i < s; i++ ) {
      for ( j = 0; j < s; j++ ) {
         printf("%d\t", mat[i][j]);
      }
      printf("\n");
   }
}
int main(){
   int n = 5;
   cout << "Spiral numbers for " << n << " lines." << endl;
   solve( n );
}

输出

Spiral numbers for 5 lines.
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

输出(n = 12)

Spiral numbers for 12 lines.
1	2	3	4	5	6	7	8	9	10	11	12	
44	45	46	47	48	49	50	51	52	53	54	13	
43	80	81	82	83	84	85	86	87	88	55	14	
42	79	108	109	110	111	112	113	114	89	56	15	
41	78	107	128	129	130	131	132	115	90	57	16	
40	77	106	127	140	141	142	133	116	91	58	17	
39	76	105	126	139	144	143	134	117	92	59	18	
38	75	104	125	138	137	136	135	118	93	60	19	
37	74	103	124	123	122	121	120	119	94	61	20	
36	73	102	101	100	99	98	97	96	95	62	21	
35	72	71	70	69	68	67	66	65	64	63	22	
34	33	32	31	30	29	28	27	26	25	24	23

结论

在学习编程语言时,显示数字模式是一个相当常见的问题。在本文中,我们了解了如何在 C++ 中以螺旋形式打印元素的正方形中显示数字。从左上角开始,我们向右移动,然后在 n 列的末尾向下移动,然后在 n 行的末尾向左移动,然后在到达第一行后向上移动到第二行,然后重复相同的操作,直到完成整个正方形。与其他数字模式问题不同,它需要一个二维数组才能有效地解决这个问题。


相关文章