题目如下: 描述 给定一个nn的矩阵(3 <= n <= 100,元素的值都是非负整数)。通过(n-1)次实施下述过程,可把这个矩阵转换成一个11的矩阵。每次的过程如下:
首先对矩阵进行行归零:即对每一行上的所有元素,都在其原来值的基础上减去该行上的最小值,保证相减后的值仍然是非负整数,且这一行上至少有一个元素的值为0。
接着对矩阵进行列归零:即对每一列上的所有元素,都在其原来值的基础上减去该列上的最小值,保证相减后的值仍然是非负整数,且这一列上至少有一个元素的值为0。
然后对矩阵进行消减:即把nn矩阵的第二行和第二列删除,使之转换为一个(n-1)(n-1)的矩阵。
下一次过程,对生成的(n-1)(n-1)矩阵实施上述过程。显然,经过(n-1)次上述过程, nn的矩阵会被转换为一个1*1的矩阵。
请求出每次消减前位于第二行第二列的元素的值。
输入 第一行是一个整数n。 接下来n行,每行有n个正整数,描述了整个矩阵。相邻两个整数间用单个空格分隔。 输出 输出为n行,每行上的整数为对应矩阵归零消减过程中,每次消减前位于第二行第二列的元素的值。
题意是要对矩阵进行“降阶”操作 那么在计算机中用数组怎么降阶呢? 答案就是进行元素的移动和矩阵阶的递减,从而达到并非真实的“降阶”操作。 不过效果依然达到,但要求是不得引用阶外的元素,因为那些元素属于无效元素。 这部分的代码如下:
for (k = n; k > 0; k--) { printf("%d\n", a[1][1]); for (i = 0; i < k; i++)//归零 { for (min = a[i][0], j = 1; j < k; j++) if (a[i][j] < min) min = a[i][j]; if (min == 0) continue; for (j = 0; j < k; j++) a[i][j] -= min; } for (j = 0; j < k; j++) { for (min = a[0][j], i = 1; i < k; i++) if (a[i][j] < min) min = a[i][j]; if (min == 0) continue; for (i = 0; i < k; i++) a[i][j] -= min; } for (i = 0; i < k; i++)//列数消减 { if (i == 1) continue; for (j = 1; j < k - 1; j++) { a[i][j] = a[i][j + 1]; } } for (i = 1; i < k - 1; i++)//行数消减 for (j = 0; j < k - 1; j++) a[i][j] = a[i + 1][j]; }接下来或许才是正文: 这题我卡了很久,但原因不在思路,不在bug,而是对于题意的把握。这个题要求的是消减前该元素的值。 那我们想想,一个三阶矩阵降阶前,存在该元素,降阶成二阶后,在降阶成一阶前,也存在该元素,之后便应该不存在该元素了,那么,一个三阶矩阵不应该只有2个输出吗? 同理:n阶矩阵不应该只有n-1个输出吗?哪来的n个输出,经过多次尝试不同的理解题意,ac后最终得出结论:最后一个输出就等于倒数第二个输出,所以这可以说算是本题的一个坑,当然,我个人认为这算是一处不合理。 全部的源代码如下:
#include"stdio.h" #define N 100 int main() { int i, j, k = 0, min, m, n, a[N + 1][N + 1]; scanf("%d", &n); for (i = 0; i < n; i++) for (j = 0; j < n; j++) scanf("%d", &a[i][j]); for (k = n; k > 0; k--) { printf("%d\n", a[1][1]); for (i = 0; i < k; i++)//归零 { for (min = a[i][0], j = 1; j < k; j++) if (a[i][j] < min) min = a[i][j]; if (min == 0) continue; for (j = 0; j < k; j++) a[i][j] -= min; } for (j = 0; j < k; j++) { for (min = a[0][j], i = 1; i < k; i++) if (a[i][j] < min) min = a[i][j]; if (min == 0) continue; for (i = 0; i < k; i++) a[i][j] -= min; } for (i = 0; i < k; i++)//列数消减 { if (i == 1) continue; for (j = 1; j < k - 1; j++) { a[i][j] = a[i][j + 1]; } } for (i = 1; i < k - 1; i++)//行数消减 for (j = 0; j < k - 1; j++) a[i][j] = a[i + 1][j]; } return 0; }新手第一次写博客,请多多支持。 有不合理之处,尽管指出。