K*******i 发帖数: 399 | 1 const int M = 4;
const int N = 5;
// si: row of the upper left element of the sub matrix
// sj: col of the upper left elment of the sub matrix
// m: rows of the current sub matrix
// n: cols of the current sub matrix
void PrintMatrix(int A[M][N], int si, int sj, int m, int n)
{
if (m == 0 || n == 0)
return;
if (m == 1)
{
for (int j = 0; j < n; j++)
cout << A[si + 0][sj + j] << " ";
}
else if (n == 1)
{
for (int i = 0; i < m; i++)
cout << A[si + i][sj + 0] << " ";
}
else
{
for (int j = 0; j < n - 1; j++)
cout << A[si + 0][sj + j] << " ";
for (int i = 0; i < m - 1; i++)
cout << A[si + i][sj + n - 1] << " ";
for (int j = n - 1; j > 0; j--)
cout << A[si + m - 1][sj + j] << " ";
for (int i = m - 1; i > 0; i--)
cout << A[si + i][sj + 0] << " ";
PrintMatrix(A, si + 1, sj + 1, m - 2, n - 2);
}
}
int main()
{
int A[M][N] = { {1, 2, 3, 4, 5}, {5, 6, 7, 8, 9}, {10, 11 ,12, 13,
14}, {15, 16, 17, 18, 19}};
PrintMatrix(A, 0, 0, M, N);
} | K*******i 发帖数: 399 | 2 si和sj还可以合并成一个变量,它们的值是同步变化的。 | s******n 发帖数: 3946 | 3 写个循环的,思路和lz是一样的,同样的三个分支判断:1行/1列/多行多列
void print(int **a, int M, int N)
{
int l = 0;
int r = M-1;
int t = 0;
int b = N-1;
while (l<=r && t<=b) {
if (l==r) {
for (int i=t; i<=b; i++) printf("%d ", a[i][l]);
} else if (t==b) {
for (int i=l; i<=r; i++) printf("%d ", a[t][i]);
} else {
for (int i=l; i
for (int i=t; i
for (int i=r; i>l; i--) printf("%d ", a[b][i]);
for (int i=b; i
}
l++;r--;
t++;b--;
}
} | w****x 发帖数: 2483 | | k*******r 发帖数: 355 | | K*******i 发帖数: 399 | 6 能否给个更简洁的递归或者循环版本的?
【在 k*******r 的大作中提到】 : 这还算简洁阿?代码行数还是太多了点吧
| s******n 发帖数: 3946 | 7 循环版本的我在上面写了啊
【在 K*******i 的大作中提到】 : 能否给个更简洁的递归或者循环版本的?
| K*******i 发帖数: 399 | 8 是kittybear觉得还不够简洁。
你的循环版本不错,本质上很难更简化了
【在 s******n 的大作中提到】 : 循环版本的我在上面写了啊
| b******t 发帖数: 965 | 9 前几天google screen就考了这个题
知道是老题但是自己没写过
搞这些edge condition搞了好久
估计要挂掉了
【在 K*******i 的大作中提到】 : 是kittybear觉得还不够简洁。 : 你的循环版本不错,本质上很难更简化了
|
|