#例题

链接:https://ac.nowcoder.com/acm/contest/93957/E 来源:牛客网

题目描述

给定一个m*n的矩阵,寻找这个矩阵的鞍点。鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。例如:在下面的例子中(第4行第1列的元素就是鞍点,值为8 )。

11 3 5 6 9

12 4 7 8 10

10 5 6 9 11

8 6 4 7 2

15 10 11 20 25

如果存在鞍点,输出鞍点所在的行、列及其值,如果存在多个,先输出行数更小的,行数相同,先输出列数最小的,如果不存在,输出"No"。

输入描述: 第1行:2个数m,n,对应矩阵的行列数量

(2<=m, n<=100) 第2-m+1行:每行n

个数中间用空格分隔(0<=m(i,j)

<=1000)

输出描述:

如果存在t个鞍点,输出共t行,每行3个 数,对应所在的行、列及其值,如果不存 在鞍点,输出"No"

示例1

输入

5 5

11 3 5 6 9

12 4 7 8 10

10 5 6 9 11

8 6 4 7 2

15 10 11 20 25

输出

4 1 8

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <iostream>
#include <vector>
#include <new>
#include<algorithm>
#include <cmath> 
#include <cstdlib>
#define PI 3.14
using namespace std;

int main()
{
	int m,n,flag=0;
    int x=0;
	cin>>m>>n;
	int a[m][n];
	for(int i=0;i<m;i++){
		for(int g=0;g<n;g++)cin>>a[i][g];
	}
	int max1;
	int max;
   
	for(int i=0;i<m;i++){
         flag=0;
        max=0;
		max1=a[i][0];
		//x=0;
		for(int g=1;g<n;g++){
            
			if(max1<a[i][g]){
				max=g;
				max1=a[i][g];
			}
            
		}
        
		flag=1;

		for(int g=0;g<m;g++){
            
			if(a[i][max]>a[g][max]){
                flag=0;
            }
            
		}
        
		if(flag){
            cout<<i+1<<" "<<max+1<<" "<<max1<<endl;
            flag=1;
            x++;
            //return 0;
        }
	//	else cout<<"No"<<endl;
        
	}
    if(x==0)
    cout<<"No";
	return 0;
}

#知识点储备

vector动态数组

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <iostream>
#include <vector>
#include <new>
#include<algorithm>
#include <cmath> 
#include <cstdlib>
#define PI 3.14
using namespace std;
int main()
{
	int m,n;
	cin>>m>>n;
	vector< vector < int > >(m,vector<int>(n)); 
	return 0;
}

有的题目不能用arr[m][n]这个样子声明数组,因为此时m,n为动态变量,一个数组的行数和列数在定义的时候应该是一个固定的量。