有关于一道C语言矩阵的题目,如图片所示,想了很久没有思路,请教一下各位
既然最终的矩阵是通过行和列添加任意数字形成的,那么可以反向操作让它变回0
1.先记录下-1的行列坐标,然后把它修改成0
2.按行循环,每行的每个元素减掉[0]的值,让行首全部变成0
3.按列循环,每列的每个元素减掉[0]的值,让列首全部变成0
4.此时-1的位置会变成一个负数,取相反数就是它原来的值
这道题目中,给出了一个 n x n 的矩阵,其中有一个元素被隐藏,并且其值为 -1。矩阵中的其他元素都是在经过一些操作(每次选择一行或一列并向该行或列中所有元素添加一个正整数)之后所得到的。要求输出隐藏的元素的行坐标和列坐标。
可以发现,每次操作都是对一行或一列中的所有元素进行操作,那么可以考虑使用行和列的和来判断哪一行或哪一列中的元素未被修改。
首先遍历整个矩阵,记录每一行和每一列的和,并记录矩阵中-1的坐标。 然后找到矩阵中行和与列和的最小值,这个最小值对应的行和列中肯定有一个没有被修改,可以通过记录下来的坐标来判断哪一行或哪一列是未修改的。
因为要遍历整个矩阵,所以时间复杂度为 O(n^2)下面是一种可行的代码实现方式:
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
scanf("%d", &n);
int matrix[n][n];
int row_sum[n], col_sum[n];
int hide_x, hide_y; // -1 的坐标
for (int i = 0; i < n; i++) {
row_sum[i] = col_sum[i] = 0;
for (int j = 0; j < n; j++) {
scanf("%d", &matrix[i][j]);
row_sum[i] += matrix[i][j];
col_sum[j] += matrix[i][j];
if (matrix[i][j] == -1) {
hide_x = i;
hide_y = j;
}
}
}
int min_row = row_sum[0], min_col = col_sum[0];
int hide_row, hide_col;
for (int i = 1; i < n; i++) {
if (row_sum[i] < min_row) {
min_row = row_sum[i];
hide_row = i;
}
if (col_sum[i] < min_col) {
min_col = col_sum[i];
hide_col = i;
}
}
if (hide_x == hide_row) {
printf("%d %d\n", hide_x, hide_col);
} else {
printf("%d %d\n", hide_row, hide_y);
}
return 0;
}
上面这段代码使用了两个数组 row_sum 和 col_sum 分别存储每一行和每一列的和。
然后记录下 -1 的坐标,最后找出行和和列和中的最小值,并使用 -1 的坐标来判断隐藏的元素的行坐标和列坐标。
请注意,上面的代码实现是在保证了输入合法的情况下,如果需要考虑非法输入的情况需要加上对应的判断语句。