• 编程能力提升系列:1. 二维矩阵的最大值问题


    一、题目

    描述

    给定一个仅包含0和1的n*n二维矩阵,请计算二维矩阵的最大值。
    计算规则如下
    1、每行元素按下标顺序组成一个二进制数(下标越大约排在低位),二进制数的值就是该行的值,矩阵各行之和为矩阵的值
    2、允许通过向左或向右整体循环移动每个元素来改变元素在行中的位置
    比如:[1,0,1,1,1] 向右整体循环移动两位 [1,1,1,0,1], 二进制数为11101 值为29
    [1,0,1,1,1] 向左整体循环移动两位 [1,1,1,1,0], 二进制数为11110 值为30

    输入描述

    1.数据的第一行为正整数,记录了N的大小, 0<N<=20
    2.输入的第2到n+1行为二维矩阵信息, 行内元素边角逗号分割

    输出描述

    矩阵的最大值

    示例1

    输入
    5
    1,0,0,0,1
    0,0,0,1,1
    0,1,0,1,0
    1,0,0,1,1
    1,0,1,0,1

    输出
    122

    说明第一行向右整体循环移动一位,得到最大值 11000 24 因此最大122

    二、代码

    1. C#代码

            public static int Matrix2DMaxValue(int n, int[,] matrix)
            {
                int result = 0;
                int rownumber = matrix.GetLength(0);
                int colnumber = matrix.GetLength(1);
                StringBuilder temp = new StringBuilder() ;
    
                for (int i = 0; i < rownumber; i++)
                {
                    int max = 0;
                    for (int j = 0; j < colnumber; j++)
                    {
                        for (int k = j; k < colnumber; k++)//first part
                        {
                            temp.Append(matrix[i, k].ToString());
                        }
    
                        for (int k = 0; k < j; k++)//last part
                        {
                            temp.Append(matrix[i, k].ToString());
                        }
    
                        Debug.WriteLine(temp.ToString());
                        max = Math.Max(max, Convert.ToInt32(temp.ToString(),2));
                        temp.Clear();
                    }
                    result += max;
                }
                return result;
            }
    
            public static int Matrix2DMaxValue(int n,string[] matrix)
            {
                int result = 0;
                StringBuilder temp = new StringBuilder();
    
                for (int i = 0; i < n; i++)
                {
                    temp.Clear();
                    temp.Append(matrix[i].Replace(",", string.Empty));
    
                    int max = 0;
    
                    for (int j = 0; j < n; j++)
                    {
                        char firtchar = temp[0];
                        temp.Remove(0, 1).Append(firtchar);
                        max = Math.Max(max, Convert.ToInt32(temp.ToString(), 2));
                    }
                    result += max;
                }
    
                return result;
            }
    

    2. C++代码

    int MaxMatrix(vector<string> m) 
    {
        int total = 0;
    
        for (vector<string>::iterator iter = m.begin(); iter != m.end(); iter++)
        {
            //remove the commas in each string
            (*iter).erase((*iter).find(','),1);
            while ((*iter).find(',') != string::npos)
            {
                (*iter).erase((* iter).find(','), 1);
            }
    
            //calculate the maximum of the matrix
            int max = 0;
            int len=(*iter).length();
            for (int i = 0; i < len; i++)
            {
                cout << *iter<<endl;
                (*iter).append(string (1, (*iter)[0]));
                (*iter).erase(0, 1);
                int count = stoi(*iter, nullptr, 2);
                max = max < count ? count : max;
            }
            total += max;
        }
        return total;
    }
    
  • 相关阅读:
    实现选中复制时不触发点击事件
    git忽略文件权限
    ubuntu 多版本php
    you have held broken packages
    linux ifconfig ip地址错误
    linux 系统设置屏幕分辨率
    linux addr2line 用于定位程序崩溃使用
    启动报Interrupted function call:accept failed
    系统下载网站
    1 什么是Lambda表达式 look
  • 原文地址:https://www.cnblogs.com/markkang/p/16387236.html
Copyright © 2020-2023  润新知