求职过程遇到的一道面试题,当时没有做出来,回来想出几种方法,其中大多是“蛮力”解法,不得不陷入一堆的 i、j 循环之中。最后想出一种递归解法,现记录如下。
题目如下:
输入N, 打印 N*N 螺旋矩阵
比如 N = 3,打印:
1 2 3
8 9 4
7 6 5
N = 4,打印:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
递归解法如下:
+--------------------------> X 轴
| 1 2 3 4
| 12 13 14 5
| 11 16 15 6
| 10 9 8 7
|
Y轴
设元素1的坐标为(0,0),元素13的坐标为(1,1),……,任一元素的坐标为(x,y)
以下为完整代码:
//功能:打印螺旋矩阵
//参数说明:matrix :螺旋矩阵 (x,y) :第一个元素的坐标
// start :第一个元素的值 n :矩阵的大小
void SetMatrix(int **matrix, int x, int y, int start, int n) {
int i, j;
if (n <= 0)
return;
if (n == 1) {
matrix[x][y] = start;
return;
}
for (i = x; i < x + n-1; i++) /* 上部 */
matrix[y][i] = start++;
for (j = y; j < y + n-1; j++) /* 右边 */
matrix[j][x+n-1] = start++;
for (i = x+n-1; i > x; i--) /* 底部 */
matrix[y+n-1][i] = start++;
for (j = y+n-1; j > y; j--) /* 左边 */
matrix[j][x] = start++;
SetMatrix(matrix, x+1, y+1, start, n-2); /* 递归 */
}
void main() {
int i, j;
int n;
int **matrix; //螺旋矩阵(二维数组)
scanf("%d", &n);
matrix = (int **)malloc(n * sizeof(int *)); //为矩阵分配空间
for (i = 0; i<n; i++)
matrix[i] = (int *)malloc(n * sizeof(int));
SetMatrix(matrix, 0, 0, 1, n);
//打印螺旋矩阵
for(i = 0; i < n; i++) {
for (j = 0; j < n; j++)
printf("%4d", matrix[i][j]);
printf("\n");
}
}
//我修改的Java代码:
public class TestSpiralMatrix {
//功能:打印螺旋矩阵
//参数说明:matrix :螺旋矩阵
//(x,y) :第一个元素的坐标
//start :第一个元素的值 n :矩阵的大小
private static void SetMatrix(int[][] matrix, int x, int y, int start, int n) {
int i, j;
if (n <= 0)
return;
if (n == 1) {
matrix[x][y] = start;
return;
}
//感觉原来的代码有点问题,我把x和y顺序调整了过来
for (i = y; i < y + n-1; i++) /* 上部 */
matrix[x][i] = start++;
for (j = x; j < x + n-1; j++) /* 右边 */
matrix[j][y+n-1] = start++;
for (i = y+n-1; i > y; i--) /* 底部 */
matrix[x+n-1][i] = start++;
for (j = x+n-1; j > x; j--) /* 左边 */
matrix[j][y] = start++;
SetMatrix(matrix, x+1, y+1, start, n-2); /* 递归 */
}
public static void main(String[] args) {
int i, j;
// int n=15;
int n=4;
int[][] matrix = new int[n][n]; //螺旋矩阵(二维数组)
SetMatrix(matrix, 0, 0, 1, n);
//打印螺旋矩阵
for(i = 0; i < n; i++) {
for (j = 0; j < n; j++)
System.out.printf("%4d", matrix[i][j]);
System.out.printf("\n");
}
}
}
运行结果, n = 15 时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
56 57 58 59 60 61 62 63 64 65 66 67 68 69 16
55 104 105 106 107 108 109 110 111 112 113 114 115 70 17
54 103 144 145 146 147 148 149 150 151 152 153 116 71 18
53 102 143 176 177 178 179 180 181 182 183 154 117 72 19
52 101 142 175 200 201 202 203 204 205 184 155 118 73 20
51 100 141 174 199 216 217 218 219 206 185 156 119 74 21
50 99 140 173 198 215 224 225 220 207 186 157 120 75 22
49 98 139 172 197 214 223 222 221 208 187 158 121 76 23
48 97 138 171 196 213 212 211 210 209 188 159 122 77 24
47 96 137 170 195 194 193 192 191 190 189 160 123 78 25
46 95 136 169 168 167 166 165 164 163 162 161 124 79 26
45 94 135 134 133 132 131 130 129 128 127 126 125 80 27
44 93 92 91 90 89 88 87 86 85 84 83 82 81 28
43 42 41 40 39 38 37 36 35 34 33 32 31 30 29
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/blackeagle_/archive/2006/02/22/606341.aspx
分享到:
相关推荐
本文将深入探讨如何利用Python的itertools模块以及迭代器来实现打印螺旋矩阵的功能。 螺旋矩阵是一种特殊的二维数组,其中的数字按照顺时针方向螺旋式地递增。在Python中,我们可以借助迭代器这一强大的工具来实现...
- **输入输出**:可能需要从用户获取矩阵的大小,并打印出生成的螺旋矩阵。 在提供的链接中,博主可能分享了一个具体的C语言实现螺旋矩阵的示例代码,你可以通过阅读和理解该代码来进一步学习这个概念。同时,这个...
Java编程实现打印螺旋矩阵实例代码 Java编程实现打印螺旋矩阵实例代码是指使用Java语言编写的打印螺旋矩阵的程序代码。螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大,...
用c语言编写的一个小代码,实现数据的螺旋输出,我也是个初学者,相互学习。
主要介绍了Java实现的打印螺旋矩阵算法,结合完整实例形式详细分析了java打印螺旋矩阵的算法原理与实现技巧,需要的朋友可以参考下
在Python中实现打印螺旋矩阵的功能,可以采用递归的方法,这种方法简洁且易于理解。 首先,我们需要理解螺旋矩阵的填充规则。以一个N×N的矩阵为例,从左上角开始,第一层的元素会按照顺时针方向填充,即从左到右,...
在给定的场景中,我们需要实现一个程序,能够根据用户输入的数字n生成一个n×n的螺旋矩阵,并打印出来。例如,当输入为3时,输出的矩阵是: ``` 1 8 7 2 9 6 3 4 5 ``` 在这个螺旋矩阵中,数字从1开始,按照顺时针...
螺旋矩阵是一种特殊的矩阵排列方式,它将数字按照顺时针或逆时针方向从左上角开始,沿着螺旋路径填充矩阵。在给定的MATLAB源程序中,我们看到两个程序,分别实现了顺时针和逆时针的螺旋矩阵。 1. 顺时针螺旋矩阵: ...
螺旋矩阵,又称螺旋顺序矩阵,是一种特殊的二维数组排列方式,其特点是元素按顺时针...通过对数组的迭代和方向的控制,我们可以灵活地构建和打印螺旋矩阵。这种问题不仅锻炼了编程技巧,也提升了对二维数据结构的理解。
在`main`函数中,用户被要求输入矩阵的大小,然后调用`printSpiralMatrix`函数生成并打印螺旋矩阵。这个程序的运行结果是根据用户输入的矩阵大小创建并输出相应的螺旋矩阵。 在实际编程中,可能需要对输入进行错误...
5. 输出矩阵:最后,将填充好的螺旋矩阵打印出来,以便用户查看结果。 在“正时针外螺旋矩阵奇偶”这个文件中,可能包含的是关于如何处理奇数和偶数大小的矩阵的特殊情况。对于奇数大小的矩阵,中心元素会在最后一...
- 当所有的位置都被正确填充后,使用嵌套循环遍历矩阵并将每个元素打印出来,形成最终的螺旋矩阵布局。 4. **示例运行:** - 假设用户输入了一个3x3的矩阵,那么程序会按照螺旋方式依次填入字符,最后输出的结果...
螺旋数组: 打印方阵为5的螺旋矩阵为 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 输入 5 输出 矩阵 样例输入 5 样例输出 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 ...
在`main`函数中,用户输入矩阵的大小,程序会生成并打印对应的螺旋矩阵。 通过这样的实现,我们可以看到在VC环境下,C++语言的强大功能可以轻松地处理这种问题。不仅能够理解螺旋矩阵的填充逻辑,还可以进一步扩展...
螺旋矩阵是一种特殊的矩阵,其中元素按照顺时针或逆时针方向填充。在这个C语言实现中,程序首先定义了一个二维数组`array`,用于存储螺旋矩阵。用户通过输入`rows`和`cols`来确定矩阵的行数和列数。 在主函数`main...
总结来说,这个螺旋矩阵的实现方法是通过对多层循环的巧妙控制,以及对不同方向元素填充的逻辑判断,实现了螺旋矩阵的生成和打印。这样的代码设计思路对于理解和掌握矩阵操作以及循环结构的应用具有很好的学习价值。
根据给定的信息,本文将详细解释C++螺旋矩阵的相关知识点,包括螺旋矩阵的概念、实现方法以及代码解析。 ### 一、螺旋矩阵的概念 螺旋矩阵是一种按照特定规则填充数字的二维数组。具体而言,从左上角开始,按照...