PTA 输出鞍点的行列下标
输出鞍点的行列下标
作者 叶斌 单位 成都信息工程大学
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的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
分析:
- 暴力求解:for循环行数n,嵌套循环遍历找出每行中最大的值,接着超出该行中最大值对应的列中最小值,最后比较该最大值和最小值是否相同,相同即鞍点,不同即继续找。查找的同时要将鞍点的行和列值记录下来,最后输出。
- 问题:第一次写的时候没有注意一行中可能有多个相同的最大值,就有两个测试点没有通过:鞍点位于前面一个最大值,鞍点位于后一个最大值。
- 解决:每行中最大值可能有多个,所以要另外处理最大值大于1个的情况。即将多个相同的最大值放入一个数组中,遍历该数组,一一找对应列的最小值,找到即跳出循环。
通过测试的代码:
#include<stdio.h> int main(){ int n; scanf("%d",&n); int a[n][n]; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ scanf("%d",&a[i][j]); } } int max=0,maxF,minF; int count=0; int moreMax[n],mo; //一行一行的找最大值 for(int i=0;i<n;i++){ max=a[i][0]; maxF=0; moreMax[0]=-1; mo=0; for(int j=0;j<n;j++){ if(max<a[i][j]){ max=a[i][j]; maxF=j; } if(max==a[i][j]){ if(moreMax[0]==-1){ moreMax[0]=maxF; moreMax[1]=j; mo=2; }else{ moreMax[mo++]=j; } } } int min; if(mo>0){ for(int q=0;q<mo;q++){ min=a[i][moreMax[q]]; for(int k=0;k<n;k++){ if(min>a[k][moreMax[q]]){ min=a[k][moreMax[q]]; break; } } if(max==min){ maxF=moreMax[q]; count++; printf("%d %d\n",i,maxF); break; } } }else{ min=a[i][maxF]; for(int k=0;k<n;k++){ if(min>a[k][maxF]){ min=a[k][maxF]; break; } } if(max==min){ count++; printf("%d %d\n",i,maxF); break; } } } if(count==0){ printf("NONE\n"); } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 我与微信审核的“相爱相杀”看个人小程序副业
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库