题目:
编写程序,找一找一个二维数组中的鞍点(即该位置上的元素值在行中最大,在列上最小。有可能数组没有鞍点)。
要求
* 二维数组的大小、数组元素的值在运行时输入;
* 程序有友好的提示信息
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _sy1_5
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("计算矩阵鞍点(行最大,列最小)");
while (true)
{
Console.WriteLine("任意键继续,0退出");
string select = Console.ReadLine();
if (select == "0")
{
Console.WriteLine("已退出!");
break;
}
else
{
int[,] arr = new int[100, 100];//该数组
int m, n;
Console.Write("请输入二维数组的行数(小与100):");
m = int.Parse(Console.ReadLine());//矩阵行数
Console.Write("请输入二维数组的列数(小与100):");
n = int.Parse(Console.ReadLine());//矩阵列数
int i, j;
//输入该矩阵
Console.WriteLine("请输入" + m + "x" + n + "的矩阵");
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
arr[i, j] = int.Parse(Console.ReadLine());
//Convert.ToInt32(Console.Read());
}
}
//输出打印该矩阵
for (i = 0; i < m; i++)
{
if (i == m / 2)
{
Console.Write("A = ");
}
for (j = 0; j < n; j++)
{
if (i == m / 2)
{
Console.Write(arr[i, j] + " ");
}
else
{
Console.Write(" " + arr[i, j]);
}
}
Console.WriteLine();
}
int row_max;//先找到该行的最大值
int[] an_point = new int[100];//存储矩阵中所有鞍点
int count = 0;//鞍点个数
int temp1 = 0, temp2 = 0;//暂时保存该行最大值的位置
int[] x = new int[100];//保存鞍点的横坐标
int[] y = new int[100];//保存鞍点的纵坐标
bool flag = false;//判断是否是鞍点
for (i = 0; i < m; i++)
{
row_max = arr[i, 0];//令某行最大的等于该行第一个数
for (j = 0; j < n; j++)
{
if (row_max < arr[i, j])
{
row_max = arr[i, j];//找到该行最大值
//记录该数的位置
temp1 = i;
temp2 = j;
}
}
//找到最大值后判断该值在该列是否是最小值
for (int k = 0; k < m; k++)
{
if ((arr[k, temp2] < row_max) || (arr[k, temp2] == row_max && k != temp1))//不是最小值
{
flag = false;
break;
}
else//是最小值
{
flag = true;
}
}
//是鞍点
if (flag == true)
{
count++;//鞍点个数加一
an_point[count] = arr[temp1, temp2];//保存鞍点
//保存鞍点位置
x[count] = temp1 + 1;
y[count] = temp2 + 1;
}
}
if (count == 0)
{
Console.WriteLine("该矩阵无鞍点!");
}
else
{
Console.WriteLine("该矩阵有" + count + "个鞍点");
Console.WriteLine("分别是:");
for (int p = 1; p <= count; p++)
{
Console.Write("A[" + x[p] + "," + y[p] + "]=");
Console.WriteLine(an_point[p]);
}
}
}
}//结束
}
}
}
结果显示:
实验总结:首先熟悉了对C#程序定义二维数组的方法,其次因先找出该行最大值并记录位置,在它的列上判断是否是列中最小值,由于要记录鞍点个数并输出,所以需要对每个鞍点都进行记录并保存位置。