总时间限制:
1000ms
内存限制:
65536kB
-
描述
-
给定一个n*n的矩阵(3 <= n <= 100,元素的值都是非负整数)。通过(n-1)次实施下述过程,可把这个矩阵转换成一个1*1的矩阵。每次的过程如下:
首先对矩阵进行行归零:即对每一行上的所有元素,都在其原来值的基础上减去该行上的最小值,保证相减后的值仍然是非负整数,且这一行上至少有一个元素的值为0。
接着对矩阵进行列归零:即对每一列上的所有元素,都在其原来值的基础上减去该列上的最小值,保证相减后的值仍然是非负整数,且这一列上至少有一个元素的值为0。
然后对矩阵进行消减:即把n*n矩阵的第二行和第二列删除,使之转换为一个(n-1)*(n-1)的矩阵。
下一次过程,对生成的(n-1)*(n-1)矩阵实施上述过程。显然,经过(n-1)次上述过程, n*n的矩阵会被转换为一个1*1的矩阵。
请求出每次消减前位于第二行第二列的元素的值。
输入
-
第一行是一个整数n。
接下来n行,每行有n个正整数,描述了整个矩阵。相邻两个整数间用单个空格分隔。
输出
- 输出为n行,每行上的整数为对应矩阵归零消减过程中,每次消减前位于第二行第二列的元素的值。 样例输入
-
3 1 2 3 2 3 4 3 4 5
样例输出
-
3 0 0
-
本题考查的是对二维数组的综合利用,刚开始看的时候题意不是太明白,后来才弄清题意的,下面附上C语言版ac代码(带有注释),若还有更好的解题思路,欢迎提建议,加以交流。
-
#include<stdio.h> int main() { int a[100][100]={0};//先把每个元素都置零 int rm,lm,x,n,i,j; scanf("%d",&n); for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&a[i][j]);//输入数组 x=n;//把n的值赋值给xwhile(x>0) { printf("%d\n",a[1][1]); for(i=0;i<x;i++)//行归零 { rm=a[i][0];//把每行的第一个元素复制给rm for(j=0;j<x;j++) { if(a[i][j]<rm) rm=a[i][j];//如把那个值赋值给rm果有比rm更小的值就把那个值赋值给rm } if(rm!=0) { for(j=0;j<x;j++) a[i][j]-=rm;//如果最小值不为0就减去这个最小值 } } for(j=0;j<x;j++)//列归零 { lm=a[0][j]; for(i=0;i<x;i++) { if(a[i][j]<lm) lm=a[i][j]; } if(lm!=0) { for(i=0;i<x;i++) a[i][j]-=lm; } } for(i=0;i<x;i++)//行消减 for(j=2;j<x;j++) a[i][j-1]=a[i][j]; for(j=0;j<x;j++)//列消减 for(i=2;i<x;i++) a[i-1][j]=a[i][j]; x--; } return 0; }