题目源自pta
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。
输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。
输入样例1:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
输出样例1:
2 1
输入样例2:
2
1 7
4 1
输出样例2:
NONE
网上的优秀解法 ——超级优秀,用最简单的代码,很简洁的思路实现了找鞍点。
/*网上的方法:
录入数组
给一个嵌套的for循环用来遍历每个数
再给一个循环,用来判断行最大和列最小
分别用两个if语句判断行最大行最小*/
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int a[6][6];//不能写成a[n][n],因为要事先给数组分配好内存,可以这样子写
int x = 0;
for (int i = 0; i < n; i++)//双层for循环录入二维数组
{
for (int j = 0; j < n; j++)
cin >> a[i][j];
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
int num = a[i][j];//双层for循环遍历数组内所有数,取一个临时变量num存储每个元素
int standrad = 0;//该变量用于判断是否同时满足行最大和列最小
for (int k = 0; k < n; k++)//因为是方阵,所以用该循环同时遍历判断行和列
{
if (num < a[i][k])//判断第i行最大
{
standrad = 1;
break;
}
if (num > a[k][j])//判断第j列最小
{
standrad = 1;
break;
}
}
if (standrad == 0)
{
cout << i << " " << j << endl;//输出为第i行第j列
x++;
}
}
}
if (x == 0)
cout << "NONE" << endl;
return 0;
}
自己调试琢磨到——先找行最大,再找列最小
/*录入数组
双层for循环遍历所有值
先找到行最大值
再判断是不是列最小值
*/
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int a[6][6];
int m = 0;
int rmax, x = 0;
int cmin, y = 0;
for (int i = 0; i < n; i++)//录入
{
for (int j = 0; j < n; j++)
cin >> a[i][j];
}
for (int i = 0; i < n; i++)
{
rmax = a[i][0];//一定是循环外定义,不然每次会刷新rmax为a[i][0]
for (int j = 0; j < n; j++)
{
if (rmax <= a[i][j])//查找行最大值
{
rmax = a[i][j];
x = j;//得到第i行最大值在第j列
}
}
cmin = a[0][x];//此处,就是查找第j列的最小值
for (int k = 0; k < n; k++)
{
if (cmin >= a[k][x])
{
cmin = a[k][x];
y = k;//得到第j列里,最小值在第k行
}
}
if (rmax == cmin)//如果行最大和列最小是同一个值就打印行和列
{
cout << y << " " << x << endl;
m++;
}
}
if (m == 0)
cout << "NONE" << endl;
return 0;
}
- 运用三层(如法1)或双层(如法二)循环,能灵活实现对二维数组的横向查找(行数不变,搜索该行每一个数,即变列数),和纵向查找(列数不变,搜索该列每一个数,即变行数)
- 二维数组——外行内列,录入与查找
- 多层for循环一定要分清应该在哪一层写上循环外的语句,如判断语句和赋值语句,在循环体内赋值,每次循环会刷新该变量的值为初始值
- 在for循环内部定义的变量,在循环外无法使用,所谓局部的局部变量