Java

Как сделать так,что бы минимальный элемент каждой строки оказался в начале? Что неправильно сделала

Выполнить циклический сдвиг каждой строки заданной матрицы на некоторое количество позиций вправо, так чтобы мнимальный элемент каждой строки оказался в ее начале.
Решение:
import java.util.Scanner;
public class Main
{
//Основная функция
public static void main(String[] args) {
int m = 4,n = 5;
int [][] a = new int[m][n];
Random random = new Random();
for (int i = 0; i < a.length; i++)
for( int j = 0; j < a[i].length; j++)
a[i][j]= random.nextInt(100);

System.out.println("Исходная матрица");
printMatrix(a);

shiftMinColumn(a);
System.out.println("Полученная матрица");
printMatrix(a);
}
//Функция выводит на консоль матрицу а
public static void printMatrix(int[][] a)
{
for (int i = 0; i < a.length; i++){
for( int j = 0; j < a[i].length; j++)
System.out.println("%4d",a[i][j]);
System.out.println();
}
}
//Фцнкция циклически сдвигает столбец с минимальным элементом матрицы
public static void shiftMinColumn(int[][]a )
{
//Поиск индексов мминимального элемента
int imin = 0,jmin = 0;
for(int i = 0; i < a.length; i++){
for(int j = 0; j < a[i].length; j++)
if (a[i][j] > a[imin][jmin]){
imin = i;
jmin = j;
}
}
int m = a.length; //количество строк матрицы

//Циклический сдвиг строки с номером imin на (m+j min+1) позиций вправо
for(int times = jmin + 1; times < m; times++){ //повтор (m+j min+1) раз
//Циклический сдвиг строки с номером imin на одну позницую вправо
int tmp = a[m+1][jmin];
for(int i = m-1; j>0;j--)
a[j][jmin]=a[j-1][jmin];
a[0][jmin]= tmp;

}
}

}
Не
 System.out.println("%4d", a[i][j]); 
а
 System.out.printf("%4d", a[i][j]); 
если хотите форматированный вывод

В последнем цикле j не определена, т.к. названа i, свести к одному названию

И в самой логике, вам надо свдинуть каждую строку, значит для каждой строки надо определить индекс минимального элемента. Вы же проходите по всей матрице и в этих переменных оказывается индекс последнего минимального элемента матрицы. Надо не в двух переменных хранить, а в массиве. Каждый индекс которого будет означать строку матрицы, а значение - индекс минимального элемента матрицы.

Но я бы сделал проще. Определить метод циклического сдвига и вызвать его для каждой строки матрицы.
 import java.util.Arrays; 
import java.util.Random;

public class Test {

//Основная функция
public static void main(String[] args) {
int m = 4, n = 5;
int[][] a = new int[m][n];
Random random = new Random();
for (int i = 0; i < a.length; i++)
for (int j = 0; j < a[i].length; j++)
a[i][j] = random.nextInt(100);

System.out.println("Исходная матрица");
printMatrix(a);

// вызов циклического сдвига для каждой строки матрицы
for (int i = 0; i < a.length; i++) {
circleShift(a[i]);
}
System.out.println("Полученная матрица");
printMatrix(a);
}

//Функция выводит на консоль матрицу а
public static void printMatrix(int[][] a) {
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++)
System.out.printf("%4d", a[i][j]);
System.out.println();
}
}

// Сдвиг до минимального элемента
private static void circleShift(int[] arr) {
int indexMinElement = 0;
int min = Integer.MAX_VALUE;
for (int i = 0; i < arr.length; i++) {
if (arr[i] < min) {
min = arr[i];
indexMinElement = i;
}
}
circleShift(arr, indexMinElement);
}

// Сдвиг на n элементов
private static void circleShift(int[] arr, int n) {
if (n == 0) {
return;
}
int[] b = Arrays.copyOf(arr, arr.length);
int j = 0;
for (int i = n; i < arr.length; i++) {
arr[j++] = b[i];
}
for (int i = 0; i < n; i++) {
arr[j++] = b[i];
}
}
}
Сергей Арнаут
Сергей Арнаут
55 095
Лучший ответ
Сергей Максимовский очень не думаю что ему разрешено в данном задании пользоваться такими вещами как Arrays.copyOf...
иначе могли бы "порвать" массив на нужные части и склеить в нужном порядке
https://www.baeldung.com/java-concatenate-arrays

Похожие вопросы