19. 顺时针打印矩阵

题目

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]

解答

循环

行数m,列数n。不难发现这是一个循环

i = 0,   j++ 
j = n-1, i++
i = m-1, j--
j = 0,   i-- 

i = 1,   j++
j = n-2, i++
j = m-2, j--
j = 1,   i--

代码

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        int m = matrix.size(), n = matrix[0].size();
        int i = 0, j = 0, k = 0;
        vector<int> print;
        while(1){
            if(j == n - k) break;
            for(; j < n - k; j++)
                print.push_back(matrix[i][j]);
            i++; j--;
            
            if(i == m - k) break;
            for(; i < m - k; i++)
                print.push_back(matrix[i][j]);
            
            i--; j--;
            if(j < k) break;
            for(; j >= k; j--)
                print.push_back(matrix[i][j]);
            
            k++;
            
            i--; j++;
            if(i < k) break;
            for(; i >= k; i--)
                print.push_back(matrix[i][j]);
            i++; j++;
        }
        return print;
    }
};
### 回答1: 你可以用下面的算法来填入这个矩阵: 1. 将矩阵的中心位置设置为数字 1。 2. 按照顺时针方向,在矩阵的第一行的第二个位置填入数字 2。 3. 如果矩阵的下一个位置已被填充,则将数字放在矩阵的第一行的下一个位置。如果没有被填充,则将数字放在矩阵的下一行的第一个位置。 4. 重复步骤 2 和 3,直到填满矩阵。 下面是一个使用 c 语言实现的示例代码: ``` #include <stdio.h> #define N 5 int main() { int magic[N][N] = {0}; int row = 0, col = N / 2, num = 1; while (num <= N * N) { magic[row][col] = num++; int nextRow = (row + 1) % N; int nextCol = (col + 1) % N; if (magic[nextRow][nextCol]) { row = (row + 1) % N; } else { row = nextRow; col = nextCol; } } for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { printf("%3d ", magic[i][j]); } printf("\n"); } return 0; } ``` 这段代码会生成如下的魔方数组: 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 ### 回答2: 要实现每一行、每一列、每条对角线的累加和都相等,可以使用魔方阵的解题思路。 首先,我们需要定义一个 n×n 的数组作为矩阵,并初始化所有元素为 0。 接下来,我们需要填入数字 1 到 n^2,首先将数字 1 放在第一行的中间位置,即数组的第一行的中间列。 然后,我们从数字 2 开始,按以下规则填入数组的其他位置: - 如果要填入的位置超过矩阵的行上边界,则将该数字填入该列的下边界。 - 如果要填入的位置超过矩阵的列右边界,则将该数字填入该行的左边界。 - 如果要填入的位置已经有数字,则将该数字填入该数字的下方。 按照这样的规则,我们可以依次填入数字 2 到 n^2,直到所有位置都被填满。 最后,我们可以检查每一行、每一列和每条对角线的累加和是否相等,如果相等则该矩阵满足题目的要求。 例如,当 n = 3 时,填入数字的过程如下所示: 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 2 1 0 0 0 3 0 0 0 2 1 0 0 0 3 0 0 0 2 1 0 0 0 3 0 4 0 2 1 0 0 0 3 0 4 0 2 1 0 0 0 5 0 4 0 2 1 0 6 0 5 0 4 0 2 1 0 6 0 5 0 4 7 2 最后得到的矩阵为: 1 0 6 0 5 0 4 7 2 通过这种方法,我们可以得到满足题目要求的矩阵。 ### 回答3: 要用C语言写一个填入数字的程序,使得填入的数字能保证每一行、每一列、每条对角线的累加和都相等。首先,我们可以定义一个n×n的二维数组来表示矩阵,再定义一个一维数组来保存每一行、每一列、每条对角线的累加和。 算法如下: 1. 首先,输入一个奇数n,用变量count来表示矩阵中需要填入的数字,初始值为1。 2. 定义一个二维数组matrix来表示矩阵,并初始化为0。 3. 定义一个一维数组sum来保存每一行、每一列、每条对角线的累加和,并初始化为0。 4. 定义两个变量row和col来表示当前填入数字的位置的行列坐标,初始值为0。 5. 在一个循环中填入数字,循环次数为n×n。 - 将count填入matrix[row][col]。 - 将count加到sum[row]、sum[col]、sum[n](主对角线)或sum[2*n](副对角线)。 - 如果col=n-1,则将col重置为0,row加1;否则,col加1。 - 如果row=n,则将row重置为0。 - 将count加1。 6. 打印矩阵matrix。 代码示例: #include <stdio.h> int main() { int n; printf("请输入一个奇数n:"); scanf("%d", &n); int matrix[n][n]; int sum[2 * n + 2] = {0}; int count = 1, row = 0, col = 0; for (int i = 0; i < n * n; i++) { matrix[row][col] = count; sum[row] += count; sum[n + col] += count; if (row == col) { sum[2 * n] += count; } if (row + col == n - 1) { sum[2 * n + 1] += count; } if (col == n - 1) { col = 0; row++; } else { col++; } if (row == n) { row = 0; } count++; } printf("填充后的矩阵为:\n"); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("%d ", matrix[i][j]); } printf("\n"); } return 0; } 这段代码实现了填充矩阵并输出的功能。当n=3时,输出的矩阵如下: 1 2 3 8 9 4 7 6 5 可以看到,每一行、每一列、每条对角线的累加和都相等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值