要求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
在一个 nXn 的二维整数数组中,每一行都有一个最小值,这 n 个最小值中有一个最大的。请写一段程序找出这个最大的最小值。

输入格式:
第一行为一个整数 n ,1<= n <=10,后边为 n 行,是 nXn 个整数(以空格分隔),即 nXn 的二维整数数组。

输出格式:
只有一行为三个整数,依次为这个最大的最小值及它所在行和列的下标(分别以一个空格分隔。如果某行的最小值出现多次,则要求记录列下标最小的那个,如果最大的最小值出现多次,则要求记录下标最小的那行)。测试数据保证所有整数均可以用 int 型存储。

输入样例:
1 2 3
4 5 6
7 8 9

输出样例:
7 2 0

代码

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include<iostream>
using namespace std;

struct Node {
int num;
int M;
int N;
};

int main() {

//生成二维动态数组
int n;
cin >> n;
int** p = new int* [n];
for (int i = 0; i < n; i++) {
p[i] = new int[n];
}

//生成一个存储空间来存储每行的最小值
Node* q = new Node[n];

//数据的输入
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> p[i][j];
}
}

//寻找每一行的最小值
for (int i = 0; i < n; i++) {
(q + i)->num = p[i][0];
(q + i)->M = i;
(q + i)->N = 0;
for (int j = 0; j < n; j++) {
if (p[i][j] < (q + i)->num) {
(q + i)->num = p[i][j];
(q + i)->N = j;
}
}
}

//找到这些最小值里面的最大值
Node size;
size.num = q->num;
for (int k = 0; k < n; k++) {
if ((q + k)->num > size.num) {
size.num = (q + k)->num;
size.M = (q + k)->M;
size.N = (q + k)->N;
}
}

//二维动态空间的释放
for (int i = 0; i < n; i++) {
delete[] p[i];
}
delete[]p;

//一维动态数组的释放
delete[]q;

cout << size.num << " " << size.M << " " << size.N;
return 0;
}