抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

总时间限制: 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 行,每行上的整数为对应矩阵归零消减过程中,每次消减前位于第二行第二列的元素的值。

样例输入

1
2
3
4
3
1 2 3
2 3 4
3 4 5

样例输出

1
2
3
3
0
0

思路

  1. 读入矩阵
  2. 输出第二行第二列的元素(注意这个地方,它并不是归零后的第二行第二列的元素,而是归零前的第二行第二列的元素)
  3. 对矩阵进行行归零
  4. 对矩阵进行列归零
  5. 对矩阵进行消减

Code

C++ STL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <bits/stdc++.h>
using namespace std;

int main() {
int n;
array<array<int, 100>, 100> a;
array<int, 100> line, row;
cin >> n;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) cin >> a[i][j];
}
while(n > 0) {
cout << a[1][1] << endl;
for(int i = 0; i < n; i++) {
line[i] = a[i][0];
for(int j = 0; j < n; j++) if(line[i] > a[i][j]) line[i] = a[i][j];
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) a[i][j] -= line[i];
}
for(int i = 0; i < n; i++) {
row[i] = a[0][i];
for(int j = 0; j < n; j++) if(row[i] > a[j][i]) row[i] = a[j][i];
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) a[j][i] -= row[i];
}
for(int i = 0; i < n; i++) for(int j = 1; j < n-1; j++) a[i][j] = a[i][j+1];
for(int i = 0; i < n; i++) for(int j = 1; j < n-1; j++) a[j][i] = a[j+1][i];
n--;
}
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
using namespace std;

int main() {
int n;
int a[100][100];
int line[100], row[100];
cin >> n;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) cin >> a[i][j];
}
while(n > 0) {
cout << a[1][1] << endl;
for(int i = 0; i < n; i++) {
line[i] = a[i][0];
for(int j = 0; j < n; j++) if(line[i] > a[i][j]) line[i] = a[i][j];
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) a[i][j] -= line[i];
}
for(int i = 0; i < n; i++) {
row[i] = a[0][i];
for(int j = 0; j < n; j++) if(row[i] > a[j][i]) row[i] = a[j][i];
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) a[j][i] -= row[i];
}
for(int i = 0; i < n; i++) for(int j = 1; j < n-1; j++) a[i][j] = a[i][j+1];
for(int i = 0; i < n; i++) for(int j = 1; j < n-1; j++) a[j][i] = a[j+1][i];
n--;
}
}

C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>

int main() {
int n;
int a[100][100];
int line[100], row[100];
scanf("%d", &n);
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) scanf("%d", &a[i][j]);
}
while(n > 0) {
printf("%d\n", a[1][1]);
for(int i = 0; i < n; i++) {
line[i] = a[i][0];
for(int j = 0; j < n; j++) if(line[i] > a[i][j]) line[i] = a[i][j];
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) a[i][j] -= line[i];
}
for(int i = 0; i < n; i++) {
row[i] = a[0][i];
for(int j = 0; j < n; j++) if(row[i] > a[j][i]) row[i] = a[j][i];
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) a[j][i] -= row[i];
}
for(int i = 0; i < n; i++) for(int j = 1; j < n-1; j++) a[i][j] = a[i][j+1];
for(int i = 0; i < n; i++) for(int j = 1; j < n-1; j++) a[j][i] = a[j+1][i];
n--;
}
}