Java Program to Form Coils in a Matrix

2025年5月8日 | 阅读 7 分钟

在二维网格中创建类似于螺旋或同心环的特定图案称为“在矩阵中形成线圈”。此操作通常需要找到矩阵元素的有序遍历,其中值按顺序和结构化方式分组。为了确保矩阵的每个方面都按正确的顺序访问,线圈通常通过遵循右、下、左、上等方向移动来构建。它们也可以向外扩展或向内压缩。

给定一个正数 n,表示一个 2n x 2n 矩阵 的大小,该矩阵从上到下、从左到右填充,值范围从 1 到 n。我们的任务是在形成矩阵的两个线圈后打印它们。此方法常用于解决数据组织、可视化表示或需要空间模式的模拟问题。

示例 1

输入

int N = 2

输出

线圈 1 是

36 28 20 21 22 30 38 46 54 53 52 51 50 42 34 26 18 10 2 3 4 5 6 7 8 16 24 32 40 48 56 64

线圈 2 是

29 37 45 44 43 35 27 19 11 12 13 14 15 23 31 39 47 55 63 62 61 60 59 58 57 49 41 33 25 17 9 1

解释

对于线圈 1,它从右下角 (64) 开始,逆时针向内旋转。

  • 从 64 向左移动到 56、48、40、32、24、16。
  • 向上移动到 8、7、6、5、4、3、2。
  • 向右到 10、18、26、34、42、50 和 58。
  • 直到捕获线圈 1 的所有元素,继续以逆时针螺旋状前进。

然后线圈 1 的结果是 36 28 20 21 22 30 38 46 54 53 52 51 50 42 34 26 18 10 2 3 4 5 6 7 8 16 24 32 40 48 56 64。

对于线圈 2,它从左下角 (29) 开始,逆时针向内旋转。

  • 从 29 向右移动到 37、45、53、61、63。
  • 向下移动到 62、61、60、59、58、49、41。
  • 向左到 33、25、17、9、1。
  • 直到捕获线圈 2 的所有元素,继续以逆时针螺旋状前进。

然后线圈 2 的结果是 29 37 45 44 43 35 27 19 11 12 13 14 15 23 31 39 47 55 63 62 61 60 59 58 57 49 41 33 25 17 9 1。

示例 2

输入

int N = 4

输出

线圈 1 是

240 224 208 192 176 160 144 128 112 96 80 64 48 32 16 15 14 13 12 11 10 9 8 24 40 56 72 88 104 120 136 152 168 184 200 216 232 248 264 280 296 312 328 344 360 376 392 408 424 440 456 472 488 504 520 536 552 568 584 600 616 632 648 664 680 696 712 728 744 760 776 792 808 824 840 856 872 888 904 920 936 952 968 984 1000 1016.

线圈 2 是

225 241 257 273 289 305 321 337 353 369 385 401 417 433 449 465 481 497 513 529 545 561 577 593 609 625 641 657 673 689 705 721 737 753 769 785 801 817 833 849 865 881 897 913 929 945 961 977 993 1009 1025 1041 1057 1073 1089 1105 1121 1137 1153 1169 1185 1201 1217 1233 1249 1265 1281 1297 1313 1329 1345 1361 1377 1393 1409 1425 1441 1457 1473 1489 1505 1521.

解释

对于线圈 1,

  • 它从右下角的 256 开始,逆时针螺旋向内。
  • 跳过已使用的行,向左到 240、224、208、192、…,然后向上。
  • 直到捕获线圈 1 的所有元素,继续以逆时针螺旋状前进。

然后线圈 1 的结果是 240 224 208 192 176 160 144 128 112 96 80 64 48 32 16 15 14 13 12 11 10 9 8 24 40 56 72 88 104 120 136 152 168 184 200 216 232 248 264 280 296 312 328 344 360 376 392 408 424 440 456 472 488 504 520 536 552 568 584 600 616 632 648 664 680 696 712 728 744 760 776 792 808 824 840 856 872 888 904 920 936 952 968 984 1000 1016。

对于线圈 2,

  • 它从左下角 (225) 开始,顺时针螺旋向内。
  • 向上到 241、257、273、289、…,然后从上次中断的地方继续顺时针螺旋前进。
  • 继续直到捕获线圈 2 的所有元素。

然后线圈 2 的结果是 225 241 257 273 289 305 321 337 353 369 385 401 417 433 449 465 481 497 513 529 545 561 577 593 609 625 641 657 673 689 705 721 737 753 769 785 801 817 833 849 865 881 897 913 929 945 961 977 993 1009 1025 1041 1057 1073 1089 1105 1121 1137 1153 1169 1185 1201 1217 1233 1249 1265 1281 1297 1313 1329 1345 1361 1377 1393 1409 1425 1441 1457 1473 1489 1505 1521。

Java Program to Form Coils in a Matrix

矩阵中总共有 16n2 个元素。每个组件被分成两个线圈。每个线圈包含 8n2 个元素。这是我们创建的数组的大小。线圈一中的元素首先按指定顺序遍历填充。使用公式 coil2[i] = 16*n*n + 1 -coil1[i],在填充了 coil1 的元素后,我们可以获得其他线圈二的元素。

方法:朴素方法

对于 4N×4N 网格,长度为 M=8N2 的两个线圈可以通过代码使用迭代和数学技术生成。每次迭代,步长增加 2,并且方向标志决定了第一个线圈 (c1[]) 中值交替递增和递减。翻转一个标志从正到负以反转其方向。使用 c1[] 中元素的数学变换,第二个线圈 (c2[]) 直接计算,无需额外遍历。直接值计算和存储是主要目标,避免了显式的矩阵表示。通过避免显式创建矩阵,该结构保证了有效的遍历和两个线圈在其内的生成。

算法

步骤 1:确定 M = 8 × N2 是总元素数。

步骤 2:设置一个名为 c1[] 的数组来保存线圈 1。

步骤 3:将 c1[0] = 8 × N2 + 2 × N 设置为线圈 1 的第一个元素。

步骤 4:使用 while 循环填充 c1[] 的其余 M−1 个元素。

步骤 5:在每次迭代中,使用一个标志来改变方向并将步长增加 2。

步骤 6:执行以下步骤。

步骤 6.1:垂直方向上添加或删除 4 × N × 标志。

步骤 6.2:水平方向上,使用标志确定是增加还是减少当前值。

步骤 7:为了确保元素被镜像,创建另一个数组 c2[],使得 c2[i]=16×N 2 +1−c1[i]。

步骤 8:通过迭代两个 数组 来逐个打印线圈 1 和线圈 2 的元素。

实施

文件名: FormedCoilsMatrix.java

输出

 
The Coil 1 is: 36 28 20 21 22 30 38 46 54 53 52 51 50 42 34 26 18 10 2 3 4 5 6 7 8 16 24 32 40 48 56 64 
The Coil 2 is: 29 37 45 44 43 35 27 19 11 12 13 14 15 23 31 39 47 55 63 62 61 60 59 58 57 49 41 33 25 17 9 1   

复杂度分析

上述代码的时间复杂度为 O(N2),空间复杂度也为 O(N2),其中 N 代表给定的整数。