代码如下;
简单来说就是1)建立二维数组 2)将输入值导入二维数组 3)找出每一行的最大值 4)将每一行的最大值组成新的数组 5)将判断最大值所在列的最小值是否为该值 6)输出下标或提示语。
using System;
namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
string op = Console.ReadLine();
int a = int.Parse(op);
int[,] vs = new int[a, a];
for (int i = 0; i < a; i++)
{
string op1 = Console.ReadLine();
string[] vs1 = op1.Split(' ');
int[] c = new int[a];
for (int m = 0; m < a; m++)
{
c[m] = int.Parse(vs1[m]);
}
for (int k = 0; k < a; k++)
{
vs[i, k] = c[k];
}
}
bool b = true;
int j, f ;
int max = 0;
int point = 0;
int[,] maxlist = new int[a, a * a];
int[,] pointlist = new int[a, a * a];
int[] qwq = new int[a];
for (j = 0; j < a; j++)//找出每一j行的最大值
{
int g = 0;
max = vs[j, 0];//假设每一行第一个最大
for (f = 1; f < a; f++)//?为什么f列不是到第四列,应该为f<a?
{
int th = vs[j, f];//把该行f列值给th
if (max < th)//如果后面的比前面的大
{
max = th;//把较大值付给max
point = f;//登记较大值下标0,1,2,3
}
}
maxlist[j, g] = max;
pointlist[j, g] = point;
qwq[j]++;
g++;
for (f = 1; f < a; f++)
{
if (vs[j, f] == max && f != point)
{
max = vs[j, f];
point = f;
maxlist[j, g] = max;
pointlist[j, g] = point;
qwq[j]++;
g++;
}
}
}
int q = 0, h = 0;
for (int i = 0; i < a; i++)//比较每一行最大值是否是该列最小值
{
for (int w = 0; w < qwq[i]; w++)
{
int ty = pointlist[i, w];//取最大值下标
int tp = maxlist[i, w];
for (int k = 0; k < a; k++)//比较该列的值,找出最小值
{
b = true;//每次循环都赋初值
if (vs[k, ty] < tp)//发现有值小于该最大值
{
b = false;
break;//增加跳出最里面循换
}
}
if (b)//如果第k列没有发现比max小的值,即为鞍点
{
Console.WriteLine(i.ToString() + " " + ty.ToString());//输出第i行,第ty列。
q++;//鞍点数量加1
}
}
}
if (q == 0)//如果比较完所有行.鞍点数量仍为0,则无鞍点
Console.WriteLine("NONE");
}
}
}
PS:其实最后判断最大值所在列的最小值是否为该值时可以直接找出该列最小值,判断是否等于最大值即可。
若有更简单的方法或有各种大小问题,大佬们敬请指正。