输入一个正整数m(1<= m <= 6)和m阶方阵A中的元素,如果找到A中的鞍点(鞍点的元素值在该行上最大,在该列上最小),就输出它的下标;否则,输出"NONE"(没有鞍点),设A中最多有一个鞍点。
输入3
1 2 3
0 1 2
0 0 1
输出2 2
样例输入4
1 2 3 4
0 1 1 3
0 0 1 2
1 0 0 1
样例输出NONE
思路及分析:用二维数组来做这道题会减小我们的难度。同时,先求出每一行的最大值,再在这一个元素的这一列来判断它是不是最小的,对它们进行判断。最后打印出这个元素的下标就可以了。同时还要注意,在样例中输入4和矩阵里的元素时发现,有重复的值(1)的时候,就算他是最小的,但因为重复,不符合鞍点的定义,所以,还需要判断是否有重复的值。另外,题目说明,鞍点最多只有一个。要注意的是,有的和它相似的题目如PTA上面的求鞍点的题目没有说明当这一行有重复的值的情况。所以,先提交带有判断重复值的代码,如果有答案错误,就注释掉重复值判断的代码。版本2对版本1进行了优化。
//版本1 #includeint main(void) { int i = 0, j = 0; int n = 0; int arr[6][6] = { 0 }; //最大值最小值 int max = 0; int min = 0; //记录列和行 int row = 0; int col = 0; //标签作用,当_bool为1的时候,输出坐标,否则输出NONE; int _bool = 1; scanf("%d", &n); for(i = 0; i < n; i++) { for(j = 0; j < n; j++) { scanf("%d", &arr[i][j]); } } for(i = 0; i < n; i++) { //假设最大值为每一行的第一个元素 max = arr[i][0]; //找这一行的最大值 for(j = 0; j < n; j++) { if(arr[i][j] > max) { //如果找到,就记录最大值,同时更新他的下标 max = arr[i][j]; col = j;//行 } } //鞍点是这一行的最大值,也是这一列的最小值 //让他成为最小值来进行后面的判断. min = arr[i][col]; for(j = 0; j < n; j++) { //判断最小值,除去了他本身. if(arr[j][col] < min) { //更新最小值的值和下标 min = arr[j][col]; row = j; _bool = 0; } } //最大值和最小值是否相等,是的话,要判断是否有重复的值 if(max == min) { _bool = 1; //这一行判断重复的值 for(j = 0; j < n; j++) { if(arr[i][j] == arr[i][col] && j != col) { //有重复的值,就让标签成为0; _bool = 0; } } break; } else { _bool = 0; } } //若为1,打印,否则,不打印 if(_bool == 1) { printf("%d %d", row, col); } else { printf("NONE"); } return 0; }
//版本2 #includeint main() { int n = 0; scanf("%d",&n); int arr[6][6] = { 0 }, i = 0, j = 0; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { scanf("%d", &arr[i][j]); } } // 题目保证给出的矩阵最多存在一个鞍点 int max = 0, row = 0, col = 0,_bool = 0; for (i = 0; i < n; i++) { //记录 _bool = 1; //假设每一行最大值为第一个元素 max = arr[i][0]; //列为0 col = 0; for (j = 0;j < n;j++) { if (arr[i][j] >= max) { max = arr[i][j]; col = j; row = i; } } //判断一行是否有重复的值 for(j = 0; j < n; j++) { if(arr[i][j] == arr[i][col] && j != col) { //有重复的值,就让标签成为0; _bool = 0; } } //同列比较 for (j=0;j arr[j][col]) { _bool = 0; break; } } if (_bool == 1) { printf("%d %d",i,col); break; } } if (!_bool) { printf("NONE"); } return 0; }



