总时间限制: 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 行,每行上的整数为对应矩阵归零消减过程中,每次消减前位于第二行第二列的元素的值。
样例输入
样例输出
思路
- 读入矩阵
- 输出第二行第二列的元素(注意这个地方,它并不是归零后的第二行第二列的元素,而是归零前的第二行第二列的元素)
- 对矩阵进行行归零
- 对矩阵进行列归零
- 对矩阵进行消减
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--; } }
|