题目:

编写程序,找一找一个二维数组中的鞍点(即该位置上的元素值在行中最大,在列上最小。有可能数组没有鞍点)。

要求
* 二维数组的大小、数组元素的值在运行时输入;
* 程序有友好的提示信息

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#程序定义二维数组的方法,其次因先找出该行最大值并记录位置,在它的列上判断是否是列中最小值,由于要记录鞍点个数并输出,所以需要对每个鞍点都进行记录并保存位置。

posted on 2017-10-21 09:52  曹婷婷  阅读(624)  评论(0编辑  收藏  举报