题目
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点的行列值。
输入格式:
输入第一行给出一个正整数n(1≤n≤6),随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。
输入样例1:
4
1 9 4 1
4 7 3 6
1 9 3 2
0 8 8 9
输出样例1:
1 1
输入样例2:
4
7 7 4 1
14 8 3 6
6 6 7 2
10 7 8 9
输出样例2:
NONE
思路
首先这道题所说的最大值指的是,所有元素都小于等于这个值,最小值指的是所有元素都大于等于这个值,这就说明了最大值和最小值不只一个,由此想到了,需要一个数组,记为index,记录当前行最小值的列下标,然后遍历index数组,判断该列下这个值是不是最小值,如果是,则输出结果,并返回,否则继续查找。
用以下图片来说明这个思路:
首先遍历第一行,找出该行最大值9,有两个
然后遍历该最大值9对应的列,比较发现9不是最小值
遍历第二行,找到最大值7
然后遍历该最大值7对应的列,比较发现7是最小值,输出结果,结束并返回
代码
#include <stdio.h>
int main(){
int n;
scanf("%d",&n);
int i;
int a[n][n];
int j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
int index[n];
int count=0;
for(i=0;i<n;i++){
int max=-1;
int min=-1;
for(j=0;j<n;j++){
if(a[i][j]>max){
max=a[i][j];
count=0;
index[count]=j;
}
else if(a[i][j]==max){
count++;
index[count]=j;
}
}
int k=0;
for(k=0;k<=count;k++){
int flag=0;
min=a[i][index[k]];
for(j=0;j<n;j++){
if(a[j][index[k]]<min&&j!=i) {
flag=1;
break;
}
}
if(flag==0) {
printf("%d %d",i,index[k]);
return 0;
}
}
}
printf("NONE");
}
运行结果
总结
通过解决矩阵鞍点问题,我深刻认识到双重循环在提升个人编程能力方面的关键性作用。通过巧妙嵌套循环,我能够遍历矩阵中的每个元素,实现对二维结构的全面探索。这锻炼了我的循环设计思维,使我能够更灵活、高效地处理复杂问题。
在这个过程中,我学会了合理选择循环的起始和结束条件,以确保程序正确执行。通过理解循环嵌套的控制流,我能够更好地分析问题并设计出更优雅的解决方案。同时,我注重了对性能的优化,避免不必要的重复计算,提高代码的执行效率。
这次编程实践为我提供了深入理解和运用双重循环的机会,加强了我在处理二维数据结构时的编程技能。这是提升个人编程水平的重要一步,为未来更复杂的算法和数据处理任务奠定了基础。