我的想法是先在一行中找到最大值 然后再这最大值的那一列找到最小值
若最大值和最小值的行数相等 则找到鞍点。
具体实现过程为
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int arr[100][100];
int n;
int i;
int j;
scanf("%d", &n);
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
scanf("%d", &arr[i][j]);
}
}
int hang = 0;
int lie = 0;
int row;
int m;
int temp;
int flag;
for (i = 0; i < n; i++)
{
hang = 0;//每次运行结束后要进行初始化,很关键。
row = i;
for (j = 0; j < n; j++)
{
if (arr[i][j] > arr[i][hang])
{
hang = j;//将这一行的最大值的列记录下来
row = i;///将这一行最大值的行记录下来 后面判断用
}
}
temp = i; //将i的值赋给temp 防止后面改变i的值影响程序
for (m = 0; m < n; m++)
{
if (arr[m][hang] < arr[temp][hang])
{
temp = m;//将temp的值不断变化 找到上面控制列的最小值
lie = m; //将这一列的最小值的行记录下来,以便后面判断
}
}
if (lie == row) //如果一行的最大值的行数 等于这一列最小值的行数
{ //那么找到鞍点
flag = 1; //将flag定义为1,条件为真,跳出循环
break;
}
flag = 0; //若找不到鞍点 则flag定义为0,条件为假
}
if (flag)
{
printf("%d %d", row, hang);
}
else
{
printf("NONE");
}
return 0;
}
这是我的想法,还是比较适合新手理解的