使用C语言程序,用O(1)的额外空间打印nxn螺旋矩阵。
给定一个正整数n,我们创建一个nxn的螺旋矩阵,只使用O(1)的额外空间,按照顺时针方向。
螺旋矩阵是一个像螺旋一样工作的矩阵,它从圆的原点开始,并以顺时针方向旋转。因此,任务是从2→4→6→8→10→12→14→16→18开始,使用O(1)的空间以螺旋形式打印矩阵。
以下是螺旋矩阵的示例:

示例
Input: 3 Output: 9 8 7 2 1 6 3 4 1
如果空间无限,解决代码就容易多了,但这并不高效,因为最佳程序或代码应该在内存和时间上都高效。为了保持螺旋顺序,使用了四个循环,每个循环分别用于矩阵的顶部、右侧、底部和左侧角,但是如果我们将矩阵分成两部分,即右上部分和左下部分,我们可以直接使用这个概念。
对于右上半部分:
mat[i][j] = (n-2*x)*(n-2*x)-(i-x)-(j-x)
对于左下半部分:
mat[i][j] = (n-2*x-2)*(n-2*x-2) + (i-x) + (j-x)
注意 - 我们正在编写打印2的倍数矩阵的程序
算法
int spiralmatrix(int n) START STEP 1: DECLARE i, j, a, b, x STEP 2: LOOP FOR i = 0 AND i < n AND i++ LOOP FOR j = 0 AND j < n AND j++ FIND THE MINIMUM IN (i<j ) AND ASSIGN IT TO a FIND THE MINIMUM (n-1-i) < (n-1-j) AND ASSIGN IT TO b THEN ASSIGN THE LEAST VALUE FROM a AND b TO x IF i <= j THEN, PRINT THE VALUE OF 2* ((n-2*x)*(n-2*x) - (i-x) - (j-x)) ELSE PRINT THE VALUE OF 2*((n-2*x-2)*(n-2*x2) + (i-x) + (j-x)) END LOOP PRINT NEWLINE END LOOP STOP
示例
#include <stdio.h>
//For n x n spiral matrix
int spiralmatrix(int n){
int i, j, a, b, x; // x stores the layer in which (i, j)th element exist
for ( i = 0; i < n; i++){
for ( j = 0; j < n; j++){
// Finds minimum of four inputs
a = ((i<j ? i : j));
b = ((n-1-i) < (n-1-j) ? (n-1-i) : (n-1-j));
x = a < b ? a : b;
// For upper right half
if (i <= j)
printf("%d\t ", 2 * ((n-2*x)*(n-2*x) - (i-x) - (j-x)));
// for lower left half
else
printf("%d\t ", 2*((n-2*x-2)*(n-2*x-2) + (i-x) + (j-x)));
}
printf("
");
}
}
int main(int argc, char const *argv[]){
int n = 3;
spiralmatrix(n);
return 0;
}输出
如果我们运行上面的程序,它将生成以下输出:
18 16 14 4 2 12 6 8 10
广告
数据结构
网络
关系数据库管理系统(RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP