【算法题】矩阵最大值

  • A+
所属分类:编程茶楼


共计 1603 个字符,预计需要花费 5 分钟才能阅读完成。

import java.util.ArrayList;
import java.util.Scanner;

/**
 * 标题:矩阵最大值 | 时间限制:1秒 | 内存限制:32768K | 语言限制:不限
 * 给定一个仅包含0和1的N*N二维矩阵,请计算二维矩阵的最大值,计算规则如下:
 * 1、 每行元素按下标顺序组成一个二进制数(下标越大越排在低位),二进制数的值就是该行的值。矩阵各行值之和为矩阵的值。
 * 2、允许通过向左或向右整体循环移动每行元素来改变各元素在行中的位置。
 * 比如: [1,0,1,1,1]向右整体循环移动2位变为[1,1,1,0,1],二进制数为11101,值为29。
 * [1,0,1,1,1]向左整体循环移动2位变为[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
 * 说明
 * 第一行向右整体循环移动1位,得到本行的最大值[1,1,0,0,0],二进制值为11000,十进制值为24。
 * 第二行向右整体循环移动2位,得到本行的最大值[1,1,0,0,0],二进制值为11000,十进制值为24。
 * 第三行向左整体循环移动1位,得到本行的最大值[1,0,1,0,0],二进制值为10100,十进制值为20。
 * 第四行向右整体循环移动2位,得到本行的最大值[1,1,1,0,0],二进制值为11100,十进制值为28。
 * 第五行向右整体循环移动1位,得到本行的最大值[1,1,0,1,0],二进制值为11010,十进制值为26。
 * 因此,矩阵的最大值为122。
 */
public class M_N_T_28 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = Integer.parseInt(scanner.nextLine());

        int[][] ints = new int[N][N];
        for (int i = 0; i < ints.length; i++) {
            String[] strings = scanner.nextLine().split(",");
            for (int j = 0; j < strings.length; j++) {
                ints[i][j] = Integer.parseInt(strings[j]);
            }
        }

        int sum_max = 0;
        ArrayList<Integer> integers = new ArrayList<>();
        for (int i = 0; i < ints.length; i++) {
            int[] anInt = ints[i];
            int temp_sum = transfer_10(anInt);
            for (int j = 0; j < (N - 1); j++) {
                int temp = anInt[0];
                for (int k = 0; k < N - 1; k++) {
                    anInt[k] = anInt[k + 1];
                }
                anInt[N - 1] = temp;

                // 计算
                int temp_sum_new = transfer_10(anInt);
                if (temp_sum < temp_sum_new) {
                    temp_sum = temp_sum_new;
                }
            }

            sum_max += temp_sum;
        }

        System.out.println(sum_max);
    }

    public static int transfer_10(int[] anIntNew) {
        int temp = 0;
        int index = 0;
        for (int i = anIntNew.length - 1; i > -1; i--) {
            temp += Math.pow(2, index++) * anIntNew[i];
        }
        return temp;
    }
}
  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: