输入一个长方形的数字矩阵,将他的两个对角线的值乘十输出。
样例输入:
1 2 3
4 5 6
7 8 9
2 1 3
样例输出:
10 2 30
4 100 6
7 160 9
20 1 30
求解
对角线乘,长宽不一样的时候,重复的点相当于是乘20?
分析样例数据,矩阵长宽不一样时,对角线是一条非45度斜线,且部分点在两条线上都存在。按以上规则,采用递归的方式计算:
#include <stdio.h>
#define MAX_ROWS 100
#define MAX_COLS 100
void multiplyOne(int matrix[MAX_ROWS][MAX_COLS], int matrixFlag[MAX_ROWS][MAX_COLS], int row, int col) {
if (matrixFlag[row][col] == 0) {
matrix[row][col] *= 10;
matrixFlag[row][col] = 1;
} else if (matrixFlag[row][col] == 1) {
matrix[row][col] *= 2;
matrixFlag[row][col] = 2;
}
}
// 对角线数字乘以10
void multiplyDiagonals(int matrix[MAX_ROWS][MAX_COLS], int matrixFlag[MAX_ROWS][MAX_COLS], int rows, int cols, int rowOffset, int colOffset) {
if (rows == 1 || cols == 1) {
// 非长方形矩阵
return;
}
int i, j;
//printf("rows=%d, cols=%d, rowOffset=%d, colOffset=%d\n", rows, cols, rowOffset, colOffset);
// 处理4个角
multiplyOne(matrix, matrixFlag, rowOffset, colOffset);
multiplyOne(matrix, matrixFlag, rowOffset, cols - 1);
multiplyOne(matrix, matrixFlag, rows - 1, colOffset);
multiplyOne(matrix, matrixFlag, rows - 1, cols - 1);
// 递归终止条件
if (rows == cols && rows - rowOffset == 2) {
return;
} else {
if (rows - rowOffset == 1 || cols - colOffset == 1) {
// 处理左上到右下对角
for (i = rowOffset; i < rows; i++) {
for (j = colOffset; j < cols; j++) {
multiplyOne(matrix, matrixFlag, i, j);
}
}
// 处理右上到左下对角
for (i = rows - 1; i >= rowOffset; i--) {
for (j = cols - 1; j >= colOffset; j--) {
multiplyOne(matrix, matrixFlag, i, j);
}
}
return;
}
}
// 处理剩余部分
if (rows - rowOffset > 2) {
rows--;
rowOffset++;
}
if (cols - colOffset > 2) {
cols--;
colOffset++;
}
multiplyDiagonals(matrix, matrixFlag, rows, cols, rowOffset, colOffset);
}
void printMatrix(int matrix[MAX_ROWS][MAX_COLS], int rows, int cols) {
int i, j;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
int main() {
int matrix[MAX_ROWS][MAX_COLS], matrixFlag[MAX_ROWS][MAX_COLS];
int rows, cols;
int i, j;
printf("请输入矩阵的行数和列数(用空格分隔):");
scanf("%d %d", &rows, &cols);
printf("请输入矩阵的元素(按行输入,每个元素用空格分隔):\n");
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
scanf("%d", &matrix[i][j]);
matrixFlag[i][j] = 0;
}
}
multiplyDiagonals(matrix, matrixFlag, rows, cols, 0, 0);
printf("输出结果:\n");
printMatrix(matrix, rows, cols);
return 0;
}
4行3列对角?