zoukankan      html  css  js  c++  java
  • C#写鞍点问题

    题目:

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

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

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

  • 相关阅读:
    【NOIP 2003】 加分二叉树
    【POJ 1655】 Balancing Act
    【HDU 3613】Best Reward
    【POJ 3461】 Oulipo
    【POJ 2752】 Seek the Name, Seek the Fame
    【POJ 1961】 Period
    【POJ 2406】 Power Strings
    BZOJ3028 食物(生成函数)
    BZOJ5372 PKUSC2018神仙的游戏(NTT)
    BZOJ4836 二元运算(分治FFT)
  • 原文地址:https://www.cnblogs.com/ttzz/p/7703797.html
Copyright © 2011-2022 走看看