首页 > 解决方案 > 将最大元素带到矩阵中心所需的最小相邻交换次数

问题描述

我们有一个 m 行 n 列的矩阵,对于 m 和 n 的偶数值,我们有 4 个中心。我们需要找到最小值。将最大元素带到矩阵中心所需的交换次数。可以使用水平和垂直相邻的元素进行交换。

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

public class solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        while (t-- > 0) {
            int m = sc.nextInt();
            int n = sc.nextInt();
            int[][] arr = new int[m][n];
            int max = Integer.MIN_VALUE;
            ArrayList<Integer> x = new ArrayList<>();
            ArrayList<Integer> y = new ArrayList<>();
            for (int i = 0; i < m; i++) {
               for (int j = 0; j < n; j++) {
                   arr[i][j] = sc.nextInt();
                   if (arr[i][j] > max)
                        max = arr[i][j];
               }
           }

           for (int i = 0; i < m; i++) {
               for (int j = 0; j < n; j++) {
                   if (arr[i][j] == max) {
                       x.add(i);
                       y.add(j);
                   }
               }
           }
           ArrayList<Integer> centreX = new ArrayList<>();
           ArrayList<Integer> centreY = new ArrayList<>();
           if (m % 2 != 0 && n % 2 != 0) {
               centreX.add(m / 2);
               centreY.add(n / 2);
           }
           if (m % 2 == 0 && n % 2 == 0) {
               centreX.add(m / 2);
               centreY.add(n / 2);
               centreX.add((m / 2) - 1);
               centreY.add(n / 2);
               centreX.add(m / 2);
               centreY.add((n / 2) - 1);
               centreX.add((n / 2) - 1);
               centreY.add((m / 2) - 1);

        }
        if (m % 2 == 0 && n % 2 != 0) {
            centreX.add(m / 2);
            centreY.add(n / 2);
            centreX.add((m / 2) - 1);
            centreY.add(n / 2);
        }
        if (m % 2 != 0 && n % 2 == 0) {
            centreX.add(m / 2);
            centreY.add(n / 2);
            centreX.add(m / 2);
            centreY.add((n / 2) - 1);
        }
        int min_swap = Integer.MAX_VALUE;
        for (int i = 0; i < x.size(); i++) {
            for (int j = 0; j < centreX.size(); j++) {
                int swap = Math.abs(x.get(i) - centreX.get(j)) + Math.abs(y.get(i) - centreY.get(j));
                if (swap < min_swap)
                    min_swap = swap;
            }
        }
        System.out.println(min_swap);
    }
}
}

我正在接受输入,然后根据矩阵的维数 m 和 n 计算矩阵的中心。它正在通过示例案例,但其他案例则失败了。

输入 测试用例 输出

标签: arraysalgorithmmatrix

解决方案


我在空闲时间逐行检查了代码

centreX.add((n / 2) - 1);
centreY.add((m / 2) - 1);

我的部分代码应该修改为

centreX.add((m / 2) - 1);
centreY.add((n / 2) - 1);

哇!所有测试用例都通过了。


推荐阅读