Задачі на матриці

1. Створено матрицю 3 x 4, заповнити її числами 0 і 1 так, щоб в одному рядку була рівно одна одиниця, і вивести на екран.
Відповідь:
public class TMat1 {
    public static void main(String[] args) {
        int[][] matrix = {{0, 1, 0, 0}, {1, 0, 0, 0}, {0, 0, 1, 0}};
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                System.out.printf("%3d ", matrix[i][j]);
            }
            System.out.println();
        }
    }
}
2. Створити і вивести на екран матрицю 2 x 3, заповнену випадковими числами з [0, 9].
Відповідь:
public class TMat2 {
    public static void main(String[] args) {
        Matrix m = new Matrix(2, 3, 0, 9);
        System.out.println(m.toString());
    }
}
3. Дана матриця. Вивести на екран перший і останній стовпці.
Відповідь:
public class TMat3 {
    public static void main(String[] args) {
        Matrix m = new Matrix(5, 5, 0, 10);
        System.out.println(m.toString());
        System.out.println("Перший стовпець");
        for (int i = 0; i < m.getN(); i++) {
            System.out.printf("%3d%n", m.getColumn(0)[i]);
        }
        System.out.println("Останній стовпець");
        for (int i = 0; i < m.getN(); i++) {
            System.out.printf("%3d%n", m.getColumn(m.getM() - 1)[i]);
        }
    }
}
4. Дана матриця. Вивести на екран перший і останній рядки.
Відповідь:
public class TMat4 {
    public static void main(String[] args) {
        Matrix m = new Matrix(6, 0, 10);
        System.out.println(m.toString());
        System.out.println("Перший рядок");
        for (int i = 0; i < m.getM(); i++) {
            System.out.printf("%3d", m.getRow(0)[i]);
        }
        System.out.println("\nОстанній рядок");
        for (int i = 0; i < m.getM(); i++) {
            System.out.printf("%3d", m.getRow(m.getN() - 1)[i]);
        }
    }
}
5. Дана матриця. Вивести на екран всі рядки з парними номерами.
Відповідь:
public class TMat5 {
    public static void main(String[] args) {
        Matrix m = new Matrix(5, 5, 0, 10);
        System.out.println(m.toString());
        for (int i = 1; i < m.getN(); i += 2) {
            for (int j = 0; j < m.getM(); j++) {
                System.out.printf("%3d", m.getRow(i)[j]);
            }
            System.out.println();
        }
    }
}
6. Дана матриця. Вивести на екран всі непарні стовпці.
Відповідь:
public class TMat6 {
    public static void main(String[] args) {
        Matrix m = new Matrix(5, 5, 0, 10);
        System.out.println(m.toString());
        for (int i = 0; i < m.getM(); i += 2) {
            for (int j = 0; j < m.getN(); j++) {
                System.out.printf("%3d", m.getColumn(i)[j]);
            }
            System.out.println();
        }
    }
}
7. Дан двомірний масив 5 × 5. Знайти суму модулів негативних непарних елементів.
Відповідь:
import static java.lang.Math.abs;

public class TMat7 {
    public static void main(String[] args) {
        Matrix m = new Matrix(2, 2, -10, 10);
        System.out.println(m.toString());
        int sum = 0;
        int element;
        for (int i = 0; i < m.getN(); i++) {
            for (int j = 0; j < m.getM(); j++) {
                element = m.getElement(i, j);
                if (element % 2 == -1 && element < 0) {
                    sum += abs(element);
                }
            }

        }
        System.out.println("Сума модулів непарних від'ємних елементів " + sum);
    }
}
8. Дан двоdbмірний масив n × m елементів. Визначити, скільки разів зустрічається число 7 серед елементів масиву.
Відповідь:
public class TMat8 {
    public static void main(String[] args) {
        Matrix m = new Matrix(10, 10, 0, 10);
        System.out.println(m.toString());
        int count = 0;
        for (int i = 0; i < m.getN(); i++) {
            for (int j = 0; j < m.getM(); j++) {
                if (m.getElement(i, j) == 7) {
                    count++;
                }
            }
        }
        System.out.println("Кількість елементів =7 -> " + count);
    }
}
9. Дана квадратна матриця. Вивести на екран елементи, які стоять на головній діагоналі.
Відповідь:
public class TMat9 {
    public static void main(String[] args) {
        Matrix m = new Matrix(5, 2, 2);
        System.out.println(m.toString());
        System.out.println("Елементи головної діаганалі");
        for (int i = 0; i < m.getN(); i++) {
            System.out.printf("%3d", m.getElement(i, i));
        }
    }
}
10. Дана матриця. Вивести k-й рядок і p-й стовпець матриці.
Відповідь:
import java.util.Arrays;
import java.util.Scanner;

public class TMat10 {
    public static void main(String[] args) {
        Matrix m = new Matrix(5, 10, 0, 10);
        System.out.println(m.toString());
        System.out.println("Який рядок вивести? Від 1 до " + m.getN() + " -> ");
        int n = new Scanner(System.in).nextInt();
        System.out.println(Arrays.toString(m.getRow(n - 1)));
        System.out.println("Який стовпець вивести? Від 1 до " + m.getM() + " -> ");
        n = new Scanner(System.in).nextInt();
        System.out.println(Arrays.toString(m.getColumn(n - 1)));
    }
}
11. Дана матриця розміру n x m. Вивести її елементи в наступному порядку: перший рядок справа наліво, другий рядок зліва направо, третій рядок справа наліво і так далі.
Відповідь:
public class TMat11 {
    public static void main(String[] args) {
        Matrix m = new Matrix(5, 4, 0, 10);
        System.out.println(m.toString());
        System.out.println("Змінена матриця");
        int[] temp = new int[m.getM()];
        for (int i = 0; i < m.getN(); i++) {
            temp = m.getRow(i);
            if (i % 2 == 0) {
                for (int j = temp.length - 1; j >= 0; j--) {
                    System.out.printf("%3d", temp[j]);
                }
            } else {
                for (int j = 0; j < temp.length; j++) {
                    System.out.printf("%3d", temp[j]);
                }
            }
            System.out.println();
        }
    }
}
12. Створити матрицю, що складається з нулів, за винятком елементів, які знаходяться в крайніх стовпчиках і рядках - вони дорівнюють одиниці.
Відповідь:
public class TMat12 {
    public static void main(String[] args) {
        Matrix m = new Matrix(10, 1, 0, 0);
        for (int j = 0; j < m.getM(); j++) {
            m.setElement(1, 0, j);
            m.setElement(1, m.getN() - 1, j);
        }
        for (int i = 0; i < m.getN(); i++) {
            m.setElement(1, i, 0);
            m.setElement(1, i, m.getM() - 1);
        }
        System.out.print(m.toString());
    }
}
13. Створити квадратну матрицю, на діагоналі якої знаходяться трійки, вище діагоналі знаходяться двійки, інші елементи дорівнює одиниці.
Відповідь:
public class TMat13 {
    public static void main(String[] args) {
        Matrix m = new Matrix(10, 1, 1);
        for (int i = 0; i < m.getN(); i++) {
            for (int j = i; j < m.getM(); j++) {
                if(i==j){
                    m.setElement(3,i,j);
                }else {
                    m.setElement(2,i,j);
                }
            }
        }
        System.out.println(m.toString());
    }
}
14. Створити квадратну матрицю з випадкових чисел з [0, 9], на побічної діагоналі якої знаходяться одиниці.
Відповідь:
public class TMat14 {
    public static void main(String[] args) {
        Matrix m = new Matrix(10, 0, 9);
        for (int i = 0; i < m.getN(); i++) {
            m.setElement(1, i, m.getN() - i - 1);
        }
        System.out.println(m.toString());
    }
}
15. Сформувати матрицю n x m, що складається з нулів і одиниць, причому одиниці знаходяться тільки в кутових клітинах.
Відповідь:
public class TMat15 {
    public static void main(String[] args) {
        Matrix m = new Matrix(3, 1, 0, 0);
        m.setElement(1,0,0);
        m.setElement(1,0,m.getM()-1);
        m.setElement(1,m.getN()-1,0);
        m.setElement(1,m.getN()-1,m.getM()-1);
        System.out.println(m.toString());
    }
}
16. Сформувати квадратну матрицю n x n, на діагоналі якої знаходяться випадкові числа з діапазону [1; 9], а інші числа рівні 1.
Відповідь:
import java.util.Random;

public class TMat16 {
    public static void main(String[] args) {
        Random random = new Random();
        Matrix m = new Matrix(10, 1, 1);
        for (int i = 0; i < m.getN(); i++) {
            m.setElement(random.nextInt(9) + 1, i, i);
        }
        System.out.println(m.toString());
    }
}
17. Заповнити матрицю так, щоб сума елементів в кожному рядку була дорівнює номеру цього рядка.
Відповідь:
import java.util.Random;

public class TMat17 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(5, -10, 10);
        modifyMatrix(matrix);
        System.out.println(matrix.toString());
    }

    private static void modifyMatrix(Matrix matrix) {
        int sum;
        Random random = new Random();
        int rElem;
        int value;
        for (int i = 0; i < matrix.getN(); i++) {
            sum = getSumRow(matrix.getRow(i));
            rElem = random.nextInt(matrix.getM());
            sum -= matrix.getElement(i, rElem);
            value = i + 1 - sum;
            matrix.setElement(value, i, rElem);
        }
    }

    private static int getSumRow(int[] row) {
        int sum = 0;
        for (int i = 0; i < row.length; i++) {
            sum += row[i];
        }
        return sum;
    }
}
18. Дана целочисленная матриця розміру 5 × 5. Переставити місцями 4 та 5 рядок.
Відповідь:
public class TMat18 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(10, 2, 0, 5);
        System.out.println(matrix.toString());
        changeMatrix(matrix);
        System.out.println(matrix.toString());
    }

    private static void changeMatrix(Matrix matrix) {

        int[] temp = matrix.getRow(matrix.getN() - 2);
        matrix.setRow(matrix.getRow(matrix.getN() - 1), matrix.getN() - 2);
        matrix.setRow(temp, matrix.getN() - 1);
    }
}
19. Сформувати матрицю, що складається з нулів і одиниць, причому кількість одиниць строго рівно кількості рядків.
Відповідь:
import java.util.Random;

public class TMat19 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(5, 5, 0, 0);
        changeMatrix(matrix);
        System.out.println(matrix.toString());
    }

    private static void changeMatrix(Matrix matrix) {
        Random random = new Random();
        int i;
        int j;
        for (int k = 0; k < matrix.getN(); k++) {
            do {
                i = random.nextInt(matrix.getN());
                j = random.nextInt(matrix.getM());
            }
            while (matrix.getElement(i, j) == 1);
            matrix.setElement(1, i, j);
        }
    }
}
20. Дано додатні цілі числа m, n і набір з m чисел. Сформувати матрицю розміру n x m, у якої в кожному стовпці містяться всі числа з вихідного набору (в тому ж порядку).
Відповідь:
import java.util.Scanner;

public class TMat20 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Кількість рядків ->");
        int n = scanner.nextInt();
        System.out.print("Кількість стовбців ->");
        int m = scanner.nextInt();
        System.out.println("Вкажіть набір чисел");
        Matrix matrix = new Matrix(n, m, 0, 0);
        int temp;
        for (int i = 0; i < n; i++) {
            System.out.print(i + 1 + " число -> ");
            temp = scanner.nextInt();
            for (int j = 0; j < m; j++) {
                matrix.setElement(temp, i, j);
            }
        }
        System.out.println("\nШукана матриця\n");
        System.out.println(matrix.toString());
    }
}
21. Сформувати матрицю, в кожному рядку якої знаходиться рівно один нуль на випадковому місці.
Відповідь:
import java.util.Random;

public class TMat21 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(2, 1, 1);
        changeMatrix(matrix);
        System.out.println(matrix.toString());
    }

    private static void changeMatrix(Matrix matrix) {
        Random random = new Random();
        int j;
        for (int i = 0; i < matrix.getN(); i++) {
            j = random.nextInt(matrix.getM());
            matrix.setElement(0, i, j);
        }
    }
}
22. Сформувати випадкову матрицю n x m, що складається з нулів і одиниць, причому в кожному стовпці число одиниць дорівнює номеру стовпчика.
Відповідь:
import java.util.Random;

public class TMat22 {
    private static Random random = new Random();
    private static Matrix matrix = new Matrix(10, 0, 0);

    public static void main(String[] args) {
        changeMatrix(matrix);
        System.out.println(matrix.toString());
    }

    private static void changeMatrix(Matrix matrix) {
        for (int j = 0; j < matrix.getM(); j++) {
            if (j >= matrix.getN()) {
                matrix.setColumn(setAllOne(), j);
            } else {
                matrix.setColumn(setOne(j+1), j);
            }
        }
    }

    private static int[] setOne(int i) {
        int[] temp = new int[matrix.getN()];
        int index;
        for (int j = 0; j < i; j++) {
            do {
                index = random.nextInt(temp.length);
            } while (temp[index] == 1);
            temp[index] = 1;
        }
        return temp;
    }
    
    private static int[] setAllOne() {
        int[] temp = new int[matrix.getN()];
        for (int i = 0; i < temp.length; i++) {
            temp[i] = 1;
        }
        return temp;
    }
}
23. Знайдіть суму всіх елементів матриці.
Відповідь:
public class TMat23 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(3, -1, 1);
        System.out.println(matrix.toString());
        int sum = getSumElem(matrix);
        System.out.println("Сума елементів = " + sum);
    }

    private static int getSumElem(Matrix matrix) {
        int sum = 0;
        for (int i = 0; i < matrix.getN(); i++) {
            for (int j = 0; j < matrix.getM(); j++) {
                sum += matrix.getElement(i, j);
            }
        }
        return sum;
    }
}
24. У довільній матриці впорядкувати за зростанням елементи рядків, розташовані після другого негативного числа.
Відповідь:
import java.util.Arrays;

public class TMat24 {

    public static void main(String[] args) {
        Matrix matrix = new Matrix(3, 10, -10, 10);
        System.out.println(matrix.toString());
        changeMatrix(matrix);
        System.out.println(matrix);
    }

    private static void changeMatrix(Matrix matrix) {
        int[] temp;
        for (int i = 0; i < matrix.getN(); i++) {
            temp = matrix.getRow(i);
            Arrays.sort(temp, secondNegativeElement(temp), matrix.getM());
            matrix.setRow(temp, i);
        }
    }

    private static int secondNegativeElement(int[] row) {
        int count = -1;
        for (int i = 0; i < row.length; i++) {
            if (row[i] < 0) {
                count++;
            }
            if (count == 1) {
                return i+1;
            }
        }
        return row.length - 1;
    }
}
25. У даній матриці знайти найменший елемент в кожному рядку.
Відповідь:
import java.util.Arrays;

public class TMat25 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(10, -10, 10);
        System.out.println(matrix.toString());
        getInfoMinElement(matrix);
    }

    private static void getInfoMinElement(Matrix matrix) {
        System.out.println("Найменьші елементи в кожному рядку");
        for (int i = 0; i < matrix.getN(); i++) {
            minElement(matrix.getRow(i), i);
        }
    }

    private static void minElement(int[] row, int i) {
        Arrays.sort(row);
        System.out.println(i + 1 + " рядок: " + row[0]);
    }
}
26. У матриці поміняти місцями першу і останню рядки.
Відповідь:
public class TMat26 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(1, 0, 10);
        System.out.println("Початкова матриця");
        System.out.println(matrix.toString());
        int[] temp = matrix.getRow(0);
        matrix.setRow(matrix.getRow(matrix.getN() - 1), 0);
        matrix.setRow(temp, matrix.getN() - 1);
        System.out.println("\nЗмінена матриця");
        System.out.println(matrix.toString());
    }
}
27. Знайти рядки в матриці, елементи в яких зростають.
Відповідь:
public class TMat27 {

    public static void main(String[] args) {
        Matrix matrix = new Matrix(1, 2, 0, 20);
        System.out.println(matrix.toString());
        getInfo(matrix);
    }

    private static void getInfo(Matrix matrix) {
        for (int i = 0; i < matrix.getN(); i++) {
            if (isRise(matrix.getRow(i))) {
                System.out.println(i + 1 + " рядок зростає.");
            }
        }
    }

    private static boolean isRise(int[] row) {
        if (row.length == 1) {
            return false;
        }
        for (int i = 0; i < row.length - 1; i++) {
            if (row[i] >= row[i + 1]) {
                return false;
            }
        }
        return true;
    }
}
28. У матриці знайти номер рядка, в якому добуток елементів мінімальний.
Відповідь:
public class TMat28 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(5, -5, 5);
        System.out.println(matrix.toString());
        getInfo(matrix);
    }

    private static void getInfo(Matrix matrix) {
        long div = divElemRows(matrix.getRow(0));
        long temp;
        int rows = -1;
        for (int i = 1; i < matrix.getN(); i++) {
            temp = divElemRows(matrix.getRow(i));
            if (div > temp) {
                div = temp;
                rows = i + 1;
            }
        }
        System.out.println(rows + " рядок шуканий");
    }

    private static long divElemRows(int[] row) {
        long temp = 1;
        for (int i = 0; i < row.length; i++) {
            temp *= row[i];
        }
        System.out.println(temp);
        return temp;
    }
}
29. Видалити рядок матриці, в якому кількість нулів максимальна.
Відповідь:
public class TMat29 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(5, -2, 2);
        System.out.println(matrix.toString());
        matrix = changeMatrix(matrix);
        System.out.println(matrix.toString());
    }

    private static Matrix changeMatrix(Matrix matrix) {
        int index = findMaxZeroMatrix(matrix);
        return delRow(matrix, index);
    }

    private static Matrix delRow(Matrix matrix, int index) {
        if (index < 0 || index >= matrix.getN()) {
            return matrix;
        }
        Matrix temp = new Matrix(matrix.getN() - 1, matrix.getM(), 0, 0);
        for (int i = 0, j = -1; i < matrix.getN(); i++) {
            j++;
            if (i == index) {
                i++;
            }
            temp.setRow(matrix.getRow(i), j);
        }
        return temp;
    }

    private static int findMaxZeroMatrix(Matrix matrix) {
        int count = 0;
        int temp;
        int index = -1;
        for (int i = 0; i < matrix.getN(); i++) {
            temp = countZero(matrix.getRow(i));
            if (count < temp) {
                count = temp;
                index = i;
            }
        }
        return index;
    }

    private static int countZero(int[] row) {
        int count = 0;
        for (int i = 0; i < row.length; i++) {
            if (row[i] == 0) {
                count++;
            }
        }
        return count;
    }
}
30. Знайдіть найбільший елемент матриці і замінити всі непарні елементи на нього.
Відповідь:
import static java.lang.Math.abs;

public class TMat30 {
    static Matrix matrix = new Matrix(5, -10, 10);

    public static void main(String[] args) {
        //  Matrix matrix=new Matrix(5,-10,10);
        System.out.println(matrix.toString());
        changeMatrix(matrix);
        System.out.println(matrix);
    }

    private static void changeMatrix(Matrix matrix) {
        int max = findMax(matrix);
        setElements(matrix, max);
    }

    private static void setElements(Matrix matrix, int max) {
        for (int i = 0; i < matrix.getN(); i++) {
            for (int j = 0; j < matrix.getM(); j++) {
                if (abs(matrix.getElement(i, j) % 2) == 1) {
                    matrix.setElement(max, i, j);
                }
            }

        }
    }

    private static int findMax(Matrix matrix) {
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < matrix.getN(); i++) {
            for (int j = 0; j < matrix.getM(); j++) {
                if (matrix.getElement(i, j) > max) {
                    max = matrix.getElement(i, j);
                }
            }
        }
        return max;
    }
}
31. Для даної матриці знайдіть транспоновану матрицю.
Відповідь:
public class TMat31 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(10, 4, 0, 5);
        System.out.println(matrix.toString());
        matrix = getTransposeMatrix(matrix);
        System.out.println(matrix.toString());
    }

    private static Matrix getTransposeMatrix(Matrix matrix) {
        Matrix temp = new Matrix(matrix.getM(), matrix.getN(), 0, 0);
        for (int i = 0; i < temp.getM(); i++) {
            temp.setColumn(matrix.getRow(i), i);
        }
        return temp;
    }
}
32. Поміняти місцями стовпці матриці так, щоб елементи першого рядка виявилися впорядкованими.
Відповідь:
public class TMat32 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(5, 0, 10);
        System.out.println(matrix.toString());
        changeMatrix(matrix);
        System.out.println(matrix.toString());

    }

    private static void changeMatrix(Matrix matrix) {
        for (int i = 0; i < matrix.getM() - 1; i++) {
            for (int j = i + 1; j < matrix.getM(); j++) {
                if (matrix.getElement(0, i) > matrix.getElement(0, j)) {
                    swapColumn(matrix, i, j);
                }
            }
        }
    }

    private static void swapColumn(Matrix matrix, int i, int j) {
        int[] temp = matrix.getColumn(i);
        matrix.setColumn(matrix.getColumn(j), i);
        matrix.setColumn(temp, j);
    }
}
33. У кожному рядку знайти найбільший елемент. З цих елементів знайти найменший і видалити ту рядок, якій він належить.
Відповідь:
import java.util.Arrays;

public class TMat33 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(5, 0, 10);
        System.out.println(matrix.toString());
        matrix = changeMatrix(matrix);
        System.out.println(matrix.toString());
    }

    private static Matrix changeMatrix(Matrix matrix) {
        int[] maxElem = new int[matrix.getN()];
        for (int i = 0; i < maxElem.length; i++) {
            maxElem[i] = getMaxElemRows(matrix.getRow(i));
        }
        int minElemIndex = getMin(maxElem);
        System.out.println(Arrays.toString(maxElem));
        System.out.println("Видалено " + (minElemIndex + 1) + " рядок");
        return delRow(matrix, minElemIndex);
    }

    private static Matrix delRow(Matrix matrix, int minElemIndex) {
        Matrix temp = new Matrix(matrix.getN() - 1, matrix.getM(), 0, 0);
        for (int i = 0, j = 0; i < matrix.getN(); i++, j++) {
            if (i == minElemIndex) {
                i++;
            }
            temp.setRow(matrix.getRow(i), j);
        }
        return temp;
    }

    private static int getMin(int[] maxElem) {
        int min = Integer.MAX_VALUE;
        int index = -1;
        for (int i = 0; i < maxElem.length; i++) {
            if (min > maxElem[i]) {
                min = maxElem[i];
                index = i;
            }
        }
        return index;
    }

    private static int getMaxElemRows(int[] row) {
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < row.length; i++) {
            if (max < row[i]) {
                max = row[i];
            }
        }
        return max;
    }
}
34. Знайдіть добуток двох даних матриць.
Відповідь:
public class TMat34 {
    public static void main(String[] args) {
        Matrix matrixA = new Matrix(1, 1, -2, 2);
        Matrix matrixB = new Matrix(1, 1, -2, 2);
        System.out.println("A");
        System.out.println(matrixA.toString());
        System.out.println("B");
        System.out.println(matrixB.toString());
        Matrix multAB = multABMatrix(matrixA, matrixB);
        System.out.println("A*B");
        System.out.println(multAB.toString());
    }

    private static Matrix multABMatrix(Matrix matrixA, Matrix matrixB) {
        if (matrixA.getM() != matrixB.getN()) {
            System.out.println("Добуток таких матриць не можливий");
            return null;
        }
        Matrix temp = new Matrix(matrixA.getN(), matrixB.getM(), 0, 0);
        int elment;
        for (int i = 0; i < temp.getN(); i++) {
            for (int j = 0; j < temp.getM(); j++) {
                elment = getElemMult(matrixA.getRow(i), matrixB.getColumn(j));
                temp.setElement(elment, i, j);
            }
        }
        return temp;
    }

    private static int getElemMult(int[] row, int[] column) {
        int elem = 0;
        for (int i = 0; i < row.length; i++) {
            elem += row[i] * column[i];
        }
        return elem;
    }
}
35. Дана квадратна матриця порядку N. Обнулити елементи матриці, що лежать одночасно вище головної діагоналі і нижче побічної діагоналі.
Відповідь:
public class TMat35 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(5, -10, 10);
        System.out.println(matrix.toString());
        matrix = changeMatrix(matrix);
        System.out.println(matrix.toString());
    }

    private static Matrix changeMatrix(Matrix matrix) {
        for (int i = 1; i < matrix.getN() - 1; i++) {
            for (int j = matrix.getM()-i; j < matrix.getM(); j++) {
                if (i < j)
                    matrix.setElement(0, i, j);
            }
        }
        return matrix;
    }
}
36. Дана матриця, що містить як позитивні, так і негативні елементи. Видалити всі її стовпці, що містять тільки позитивні елементи.
Відповідь:
import java.util.ArrayList;

public class TMat36 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(1, 10, -1, 10);
        System.out.println(matrix.toString());
        matrix = changeMatrix(matrix);
        System.out.println(matrix.toString());
    }

    private static Matrix changeMatrix(Matrix matrix) {
        ArrayList indexs = getIndexPositiveColumn(matrix);
        return delAllPositiveColumns(matrix, indexs);
    }

    private static ArrayList getIndexPositiveColumn(Matrix matrix) {
        ArrayList indexs = new ArrayList<>();
        for (int i = 0; i < matrix.getM(); i++) {
            if (notAllPositive(matrix.getColumn(i))) {
                indexs.add(i);
            }
        }
        return indexs;
    }

    private static boolean notAllPositive(int[] column) {
        for (int i = 0; i < column.length; i++) {
            if (column[i] <= 0) {
                return true;
            }
        }
        return false;
    }

    private static Matrix delAllPositiveColumns(Matrix matrix, ArrayList indexs) {
        Matrix temp = new Matrix(matrix.getN(), indexs.size(), 0, 0);
        for (int i = 0; i < indexs.size(); i++) {
            temp.setColumn(matrix.getColumn(indexs.get(i)), i);
        }
        return temp;
    }
}
37. Дана квадратна матриця. Сформувати нову матрицю, отриману з вихідної шляхом повороту відносно центру на 90 градусів за годинниковою стрілкою.
Відповідь:
38. У матриці видалити стовпці з максимальним і мінімальним елементами матриці, а потім на місце першого додати стовпець з добутку відповідних елементів видалених стовпців.
Відповідь:
public class TMat38 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(5, -20, 20);
        System.out.println(matrix.toString());
        matrix = changeMatrix(matrix);
        System.out.println(matrix);
    }

    private static Matrix changeMatrix(Matrix matrix) {
        int max = findMax(matrix);
        int min = findMin(matrix);
        System.out.println("max=" + max + "; min=" + min);
        int[] maxColumn = matrix.getColumn(max);
        int[] minColumn = matrix.getColumn(min);
        int[] newFirstColumn = multColumn(maxColumn, minColumn);
        if (max == min) {
            return newMatrix(matrix, newFirstColumn, max);
        } else {
            return newMatrix(matrix, newFirstColumn, max, min);
        }

    }

    private static Matrix newMatrix(Matrix matrix, int[] newFirstColumn, int max) {
        Matrix temp = new Matrix(matrix.getN(), matrix.getM(), 0, 0);
        temp.setColumn(newFirstColumn, 0);
        for (int i = 0, j = 1; j < temp.getM(); i++, j++) {
            if (i == max) {
                i++;
            }
            temp.setColumn(matrix.getColumn(i), j);
        }
        return temp;
    }

    private static Matrix newMatrix(Matrix matrix, int[] newFirstColumn, int max, int min) {
        Matrix temp = new Matrix(matrix.getN(), matrix.getM() - 1, 0, 0);
        temp.setColumn(newFirstColumn, 0);
        for (int i = 0, j = 1; j < temp.getM(); i++, j++) {
            while (i == max || i == min) {
                i++;
            }
            temp.setColumn(matrix.getColumn(i), j);
        }
        return temp;
    }


    private static int[] multColumn(int[] maxColumn, int[] minColumn) {
        int[] muiltiply = new int[maxColumn.length];
        for (int i = 0; i < muiltiply.length; i++) {
            muiltiply[i] = maxColumn[i] * minColumn[i];
        }
        return muiltiply;
    }

    private static int findMin(Matrix matrix) {
        int min = Integer.MAX_VALUE;
        int column = -1;
        for (int i = 0; i < matrix.getN(); i++) {
            for (int j = 0; j < matrix.getM(); j++) {
                if (min > matrix.getElement(i, j)) {
                    min = matrix.getElement(i, j);
                    column = j;
                }
            }
        }
        return column;
    }

    private static int findMax(Matrix matrix) {
        int max = Integer.MIN_VALUE;
        int column = -1;
        for (int i = 0; i < matrix.getN(); i++) {
            for (int j = 0; j < matrix.getM(); j++) {
                if (max < matrix.getElement(i, j)) {
                    max = matrix.getElement(i, j);
                    column = j;
                }
            }
        }
        return column;
    }
}

39. Cформіровать масив з елементів в сідлових точках матриць. У седловой точці елемент є мінімальним в рядку і максимальним в стовпці.
Відповідь:
import java.util.ArrayList;
import java.util.Arrays;

public class TMat39 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(1, 5, 0, 5);
        System.out.println(matrix.toString());
        Integer[] saddlePoint = getSaddlePoint(matrix);
        if (saddlePoint.length != 0) {
            System.out.println("Значення: " + Arrays.toString(saddlePoint));
        } else {
            System.out.println("Сідлові точки в матриці відсутні");
        }
    }

    private static Integer[] getSaddlePoint(Matrix matrix) {
        int[] temp;
        ArrayList al = new ArrayList<>();
        int[] minElementsRows = getMin(matrix);
        int[] maxElementsColumns = getMax(matrix);
        initArrays(al, minElementsRows, maxElementsColumns);
        return al.toArray(new Integer[al.size()]);
    }

    private static void initArrays(ArrayList al, int[] minElementsRows, int[] maxElementsColumns) {
        for (int i = 0; i < minElementsRows.length; i++) {
            for (int j = 0; j < maxElementsColumns.length; j++) {
                if (minElementsRows[i] == maxElementsColumns[j]) {
                    al.add(minElementsRows[i]);
                    System.out.println("Координати [" + (i + 1) + "; " + (j + 1) + "]");
                }
            }
        }
    }

    private static int[] getMax(Matrix matrix) {
        int[] max = new int[matrix.getM()];
        for (int i = 0; i < matrix.getM(); i++) {
            max[i] = getMaxInColumns(matrix.getColumn(i));
        }
        return max;
    }

    private static int getMaxInColumns(int[] column) {
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < column.length; i++) {
            if (max < column[i]) {
                max = column[i];
            }
        }
        return max;
    }

    private static int[] getMin(Matrix matrix) {
        int[] min = new int[matrix.getN()];
        for (int i = 0; i < matrix.getN(); i++) {
            min[i] = getMinInRows(matrix.getRow(i));
        }
        return min;
    }

    private static int getMinInRows(int[] row) {
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < row.length; i++) {
            if (min > row[i]) {
                min = row[i];
            }
        }
        return min;
    }
}
40. Дана целочисленная квадратна матриця. Вказати стовпець (назвати його номер) з мінімальною кількістю елементів, кратних сумі індексів.
Відповідь:
import java.util.Arrays;

public class TMat40 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(2, 10, -10, 10);
        System.out.println(matrix.toString());
        getInfo(matrix);
    }

    private static void getInfo(Matrix matrix) {
        int[] countElements = new int[matrix.getM()];
        for (int i = 0; i < countElements.length; i++) {
            countElements[i] = getCounts(matrix.getColumn(i), i + 1);
        }
        System.out.println(Arrays.toString(countElements));
        int minCount = getMin(countElements);
        System.out.println("Найменьша кількість елементів в стовбці " + minCount);
    }

    private static int getMin(int[] countElements) {
        int min = Integer.MAX_VALUE;
        int index = -1;
        for (int i = 0; i < countElements.length; i++) {
            if (min > countElements[i]) {
                min = countElements[i];
                index = i;
            }
        }
        return index + 1;
    }

    private static int getCounts(int[] column, int i) {
        int count = 0;
        for (int j = 0; j < column.length; j++) {
            if (column[j] % (j + 1 + i) == 0) {
                count++;
            }
        }
        return count;
    }
}
41. Видаліть рядки матриці, що не мають жодного повторюваного елемента.
Відповідь:
import java.util.ArrayList;
import java.util.Arrays;

public class TMat41 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(3, 0, 10);
        System.out.println(matrix.toString());
        matrix = changeMatrix(matrix);
        if (matrix != null)
            System.out.println(matrix.toString());
    }

    private static Matrix changeMatrix(Matrix matrix) {
        ArrayList numbRows = new ArrayList<>();
        initNumbRows(matrix, numbRows);
        return createNewMatrix(matrix, numbRows);
    }

    private static Matrix createNewMatrix(Matrix matrix, ArrayList numbRows) {
        if (numbRows.size() == 0) {
            System.out.println("Видалено всі рядки");
            return null;
        } else {
            Matrix temp = new Matrix(numbRows.size(), matrix.getM(), 0, 0);
            for (int i = 0; i < numbRows.size(); i++) {
                temp.setRow(matrix.getRow(numbRows.get(i)), i);
            }
            return temp;
        }

    }

    private static void initNumbRows(Matrix matrix, ArrayList numbRows) {
        for (int i = 0; i < matrix.getN(); i++) {
            if (isRepeatElements(matrix.getRow(i))) {
                numbRows.add(i);
            }
        }
    }

    private static boolean isRepeatElements(int[] row) {
        Arrays.sort(row);
        for (int i = 0; i < row.length - 1; i++) {
            if (row[i] == row[i + 1]) {
                return true;
            }
        }
        return false;
    }
}
42. Дана целочисльна прямокутна матриця розміру n x m. Сформувати одновимірний масив, що складається з елементів, що лежать на відрізку [a, b]. Знайти середнє арифметичне отриманого одновимірного масиву.
Відповідь:
43. Характеристикою рядка матриці назвемо суму її негативних парних елементів. Розташувати рядки за зростанням характеристик.
Відповідь:
import java.util.Arrays;

public class TMat43 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(5, 1, -10, 10);
        System.out.println(matrix.toString());
        changeMatrix(matrix);
        System.out.println(matrix.toString());
    }

    private static void changeMatrix(Matrix matrix) {
        int[] characteristic = new int[matrix.getN()];
        for (int i = 0; i < characteristic.length; i++) {
            characteristic[i] = getCharacteristicRow(matrix.getRow(i));
        }
        System.out.println("Характеристика рядків " + Arrays.toString(characteristic) + "\n");
        sortedRows(matrix, characteristic);

    }

    private static int getCharacteristicRow(int[] row) {
        int sum = 0;
        for (int i = 0; i < row.length; i++) {
            if (row[i] < 0 && row[i] % 2 == 0) {
                sum += row[i];
            }
        }
        return sum;
    }

    private static void sortedRows(Matrix matrix, int[] characteristic) {
        for (int i = 0; i < characteristic.length - 1; i++) {
            for (int j = i + 1; j < characteristic.length; j++) {
                if (characteristic[i] > characteristic[j]) {
                    swap(characteristic, i, j);
                    swap(matrix, i, j);
                }
            }
        }
    }

    private static void swap(int[] characteristic, int i, int j) {
        int t = characteristic[i];
        characteristic[i] = characteristic[j];
        characteristic[j] = t;
    }

    private static void swap(Matrix matrix, int i, int j) {
        int[] temp = matrix.getRow(i);
        matrix.setRow(matrix.getRow(j), i);
        matrix.setRow(temp, j);
    }
}
44. Матрицю n x m заповнити натуральними числами від 1 до m*n по спіралі, що починається в лівому верхньому кутку і закрученою за годинниковою стрілкою.
Відповідь:
public class TMat44 {
    static int value = 1;
    static int i = 0;
    static int j = 0;
    static int last;
    static Matrix matrix;

    public static void main(String[] args) {
        matrix = new Matrix(5, 4, 0, 0);
        last = matrix.getN() * matrix.getM();
        moveRight();
        System.out.println(matrix.toString());
    }

    private static void moveRight() {
        matrix.setElement(value, i, j);
        value++;
        if (value > last) {
            return;
        }
        if (j + 1 != matrix.getM() && matrix.getElement(i, j + 1) == 0) {
            j++;
            moveRight();
        } else {
            i++;
            moveDown();
        }
    }

    private static void moveDown() {
        matrix.setElement(value, i, j);
        value++;
        if (value > last) {
            return;
        }
        if (i + 1 != matrix.getN() && matrix.getElement(i + 1, j) == 0) {
            i++;
            moveDown();
        } else {
            j--;
            moveLeft();
        }

    }

    private static void moveLeft() {
        matrix.setElement(value, i, j);
        value++;
        if (value > last) {
            return;
        }
        if (j - 1 >= 0 && matrix.getElement(i, j - 1) == 0) {
            j--;
            moveLeft();
        } else {
            i--;
            moveUp();
        }
    }

    private static void moveUp() {
        matrix.setElement(value, i, j);
        value++;
        if (value > last) {
            return;
        }
        if (i - 1 >= 0 && matrix.getElement(i - 1, j) == 0) {
            i--;
            moveUp();
        } else {
            j++;
            moveRight();
        }
    }

}
45. Матрицю n x m заповнити натуральними числами від 1 до mn по спіралі, що починається в лівому верхньому кутку і закрученої проти годинникової стрілки.
Відповідь:
public class TMat45 {
    static int value = 1;
    static int i = 0;
    static int j = 0;
    static int last;
    static Matrix matrix;

    public static void main(String[] args) {
        matrix = new Matrix(7, 4, 0, 0);
        last = matrix.getN() * matrix.getM();
        moveDown();
        System.out.println(matrix.toString());
    }

    private static void moveRight() {
        matrix.setElement(value, i, j);
        value++;
        if (value > last) {
            return;
        }
        if (j + 1 != matrix.getM() && matrix.getElement(i, j + 1) == 0) {
            j++;
            moveRight();
        } else {
            i--;
            moveUp();
        }
    }

    private static void moveDown() {
        matrix.setElement(value, i, j);
        value++;
        if (value > last) {
            return;
        }
        if (i + 1 != matrix.getN() && matrix.getElement(i + 1, j) == 0) {
            i++;
            moveDown();
        } else {
            j++;
            moveRight();
        }

    }

    private static void moveLeft() {
        matrix.setElement(value, i, j);
        value++;
        if (value > last) {
            return;
        }
        if (j - 1 >= 0 && matrix.getElement(i, j - 1) == 0) {
            j--;
            moveLeft();
        } else {
            i++;
            moveDown();
        }
    }

    private static void moveUp() {
        matrix.setElement(value, i, j);
        value++;
        if (value > last) {
            return;
        }
        if (i - 1 >= 0 && matrix.getElement(i - 1, j) == 0) {
            i--;
            moveUp();
        } else {
            j--;
            moveLeft();
        }
    }

}
46. Куб складається з n^3 прозорих і непрозорих елементарних кубиків. Чи є хоча б один просвіт по кожному з трьох вимірів? Якщо це так, вивести координати кожного просвіту.
Відповідь:
import java.util.Arrays;
import java.util.Random;

public class TMat46 {

    public static void main(String[] args) {
        int size = 5;
        int[][][] coube = getInts(size);
        System.out.println(Arrays.deepToString(coube));
        getInfoIJ(coube);
        getInfoIK(coube);
        getInfoJK(coube);
    }

    private static int[][][] getInts(int size) {
        int[][][] coube = new int[size][size][size];
        Random random = new Random();
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                for (int k = 0; k < size; k++) {
                    coube[i][j][k] = random.nextInt(2);
                }
            }
        }
        return coube;
    }

    private static void getInfoIK(int[][][] coube) {
        for (int i = 0; i < coube.length; i++) {
            for (int k = 0; k < coube.length; k++) {
                if (isClearJ(coube, i, k)) {
                    System.out.printf("Координати [%d, 0, %d]\n", i + 1, k + 1);
                }
            }
        }
    }

    private static void getInfoIJ(int[][][] coube) {
        for (int i = 0; i < coube.length; i++) {
            for (int j = 0; j < coube.length; j++) {
                if (isClearK(coube, i, j)) {
                    System.out.printf("Координати [%d, %d, 0]\n", i + 1, j + 1);
                }
            }
        }
    }

    private static void getInfoJK(int[][][] coube) {
        for (int j = 0; j < coube.length; j++) {
            for (int k = 0; k < coube.length; k++) {
                if (isClearI(coube, j, k)) {
                    System.out.printf("Координати [0, %d, %d]\n", j + 1, k + 1);
                }
            }
        }
    }

    private static boolean isClearK(int[][][] coube, int i, int j) {
        for (int k = 0; k < coube.length; k++) {
            if (coube[i][j][k] == 1) {
                return false;
            }
        }
        return true;
    }

    private static boolean isClearJ(int[][][] coube, int i, int k) {
        for (int j = 0; j < coube.length; j++) {
            if (coube[i][j][k] == 1) {
                return false;
            }
        }
        return true;
    }

    private static boolean isClearI(int[][][] coube, int j, int k) {
        for (int i = 0; i < coube.length; i++) {
            if (coube[i][j][k] == 1) {
                return false;
            }
        }
        return true;
    }
}

47. У кожному стовпці і кожному рядку матриці міститься строго по одному нульового елементу. Перестановкою рядків домогтися розташування всіх нулів на головній діагоналі матриці. Написати функцію генерації вихідної матриці.
Відповідь:
import java.util.Arrays;
import java.util.Random;

public class TMat47 {
    public static void main(String[] args) {
        changeMatrix();
    }

    private static void changeMatrix() {
        Matrix matrix = new Matrix(3, 1, 1);
        initMatrix(matrix);
        System.out.println("Початкова матриця\n" + matrix.toString());
        matrix = sortedRows(matrix);
        System.out.println("відсортована матриця\n" + matrix.toString());


    }

    private static void initMatrix(Matrix matrix) {
        Random random = new Random();
        int[] mas = new int[matrix.getM()];
        Arrays.fill(mas, 1);
        int j;
        for (int i = 0; i < matrix.getN(); i++) {
            j = generateIndexJ(mas, random);
            matrix.setElement(0, i, j);
        }
    }

    private static Matrix sortedRows(Matrix matrix) {
        Matrix temp = new Matrix(matrix.getN(), matrix.getM(), 0, 0);
        int j;
        for (int i = 0; i < matrix.getN(); i++) {
            j = findIndex(matrix.getRow(i));
            temp.setRow(matrix.getRow(i), j);
        }

        return temp;


    }

    private static int findIndex(int[] row) {
        for (int i = 0; i < row.length; i++) {
            if (row[i] == 0) {
                return i;
            }
        }
        return 0;
    }

    private static int generateIndexJ(int[] mas, Random random) {
        int j;
        do {
            j = random.nextInt(mas.length);
        } while (mas[j] == 0);
        mas[j] = 0;
        return j;
    }
}
48. Дана цілочисельна матриця розміру n × m, елементи якої можуть набувати значень від 0 до 100. Різні рядки матриці назвемо схожими, якщо збігаються безлічі чисел, що зустрічаються в цих рядках. Знайти кількість рядків, схожих на перший рядок цієї матриці.
Відповідь:
import java.util.ArrayList;
import java.util.Arrays;

public class TMat48 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(5, 0, 3);
        System.out.println(matrix.toString());
        findLikeRows(matrix);
    }

    private static void findLikeRows(Matrix matrix) {
        Integer[] firstRows = deleteReplays(matrix.getRow(0));
        int count = 0;
        for (int i = 1; i < matrix.getN(); i++) {
            if (like(firstRows, matrix.getRow(i))) {
                count++;
                System.out.println("Рядок " + (i + 1) + " схожий");
            }
        }
        if (count == 0) {
            System.out.println("Схожі рядки відсутні");
        }
    }

    private static boolean like(Integer[] firstRows, int[] row) {
        if (Arrays.equals(firstRows, deleteReplays(row))) {
            return true;
        }
        return false;
    }

    private static Integer[] deleteReplays(int[] row) {
        Arrays.sort(row);
        ArrayList list = new ArrayList<>();
        list.add(row[0]);
        for (int i = 1; i < row.length; i++) {
            if (list.get(list.size() - 1) != row[i]) {
                list.add(row[i]);
            }
        }
        //  System.out.println("->"+list.toString());
        return list.toArray(new Integer[list.size()]);
    }
}
49.Дана квадратна матриця, що складається з натуральних чисел. Дзеркально відобразити її елементи відносно побічної діагоналі. Вивести результат на екран.
Відповідь:
public class TMat49 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(4, 8);
        System.out.println(matrix.toString());
        matrix = changeMatrix(matrix);
        System.out.println(matrix.toString());
    }

    private static Matrix changeMatrix(Matrix matrix) {
        Matrix temp = new Matrix(matrix.getN(), 0);
        init(temp, matrix);
        return temp;
    }

    private static void init(Matrix temp, Matrix matrix) {
        int[] rows;
        for (int i = 0; i < matrix.getN(); i++) {
            rows = rewers(matrix.getRow(i));
            temp.setColumn(rows, temp.getM() - i - 1);
        }
    }

    private static int[] rewers(int[] row) {
        int[] temp = new int[row.length];
        for (int i = 0; i < temp.length; i++) {
            temp[i] = row[row.length - i - 1];
        }
        return temp;
    }
}
50. Знайти максимальний серед елементів тих стовпців, які впорядковані по зростанню. Якщо впорядковані стовпці в матриці відсутні, то вивести 0.
Відповідь:
public class TMat50 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(2, 20);
        System.out.println(matrix.toString());
        getinfo(matrix);
    }

    private static void getinfo(Matrix matrix) {
        int max = Integer.MIN_VALUE;
        int temp;
        for (int j = 0; j < matrix.getM(); j++) {
            if (sorted(matrix.getColumn(j))) {
                temp = matrix.getElement(matrix.getN() - 1, j);
                if (max < temp) {
                    max = temp;
                }
            }
        }
        if (Integer.MIN_VALUE == max) {
            System.out.println(0);
        } else {
            System.out.println(max);
        }
    }

    private static boolean sorted(int[] column) {
        for (int i = 0; i < column.length - 1; i++) {
            if (column[i] >= column[i + 1]) {
                return false;
            }
        }
        return true;
    }
}
51. Латинським квадратом порядку n називається квадратна матриця розміром n x n, кожний рядок і кожен стовпець якої містять всі числа від 1 до n. Перевірити, чи є задана матриця латинським квадратом.
Відповідь:
import java.util.Arrays;
import java.util.Scanner;

public class TMat51 {
    public static void main(String[] args) {
        System.out.print("Розмір матриці: ");
        int size = new Scanner(System.in).nextInt();
        Matrix matrix = new Matrix(size, 1, size);
        System.out.println(matrix.toString());
        checkedMatrix(matrix);

    }

    private static void checkedMatrix(Matrix matrix) {
        int[] row;
        int[] col;

        for (int i = 0; i < matrix.getN(); i++) {
            row = matrix.getRow(i);
            col = matrix.getColumn(i);
            if (noLatin(row, col)) {
                System.out.println("Не латинський квадрат");
                System.exit(0);
            }
        }
        System.out.println("Латинський квадрат");
    }

    private static boolean noLatin(int[] row, int[] col) {
        Arrays.sort(row);
        Arrays.sort(col);
        for (int i = 0; i < row.length; i++) {
            if ((row[i] != i + 1) || (col[i] != i + 1)) {
                return true;
            }
        }
        return false;
    }
}

52. ***************
Відповідь:
****************

53. У тривимірному масиві n x n x n, що складається з нулів і одиниць, зберігається сіткове зображення деякого тривимірного тіла. Знайдіть в двовимірних масивах три проекції (тіні) цього тіла.
Відповідь:
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class TMat53 {
    public static void main(String[] args) {
        Random r = new Random();
        System.out.print("n->");
        int n = new Scanner(System.in).nextInt();
        int[][][] coube = new int[n][n][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                for (int k = 0; k < n; k++) {
                    coube[i][j][k] = r.nextInt(2);
                }
            }
        }
        System.out.println(Arrays.deepToString(coube));

        Matrix xy = getProectionXY(coube);
        Matrix xz = getProectionXZ(coube);
        Matrix yz = getProectionYZ(coube);

        System.out.println("XY");
        System.out.println(xy.toString());
        System.out.println("XZ");
        System.out.println(xz.toString());
        System.out.println("YZ");
        System.out.println(yz.toString());

    }

    private static Matrix getProectionXZ(int[][][] coube) {
        Matrix xz = new Matrix(coube.length, 0);
        for (int x = 0; x < coube.length; x++) {
            for (int z = 0; z < coube.length; z++) {
                xz.setElement(getValueY(coube, x, z), x, z);
            }
        }
        return xz;
    }

    private static int getValueY(int[][][] coube, int x, int z) {
        for (int i = 0; i < coube.length; i++) {
            if (coube[x][i][z] == 1) {
                return 1;
            }
        }
        return 0;
    }


    private static Matrix getProectionXY(int[][][] coube) {
        Matrix xy = new Matrix(coube.length, 0);
        for (int x = 0; x < coube.length; x++) {
            for (int y = 0; y < coube.length; y++) {
                xy.setElement(getValueZ(coube, x, y), x, y);
            }
        }
        return xy;
    }

    private static int getValueZ(int[][][] coube, int x, int y) {
        for (int i = 0; i < coube.length; i++) {
            if (coube[x][y][i] == 1) {
                return 1;
            }
        }
        return 0;
    }

    private static Matrix getProectionYZ(int[][][] coube) {
        Matrix yz = new Matrix(coube.length, 0);
        for (int y = 0; y < coube.length; y++) {
            for (int z = 0; z < coube.length; z++) {
                yz.setElement(getValueX(coube, y, z), y, z);
            }
        }
        return yz;
    }

    private static int getValueX(int[][][] coube, int y, int z) {
        for (int i = 0; i < coube.length; i++) {
            if (coube[i][y][z] == 1) {
                return 1;
            }
        }
        return 0;
    }
}
54. Поле розміром m x n заповнене прозорими і непрозорими кубиками. Знайдіть всі стовпці поля, все непрозорі кубики яких невидимі для спостерігача, розташованого зліва.
Відповідь:
public class TMat54 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(2, 5, 0, 1);
        System.out.println(matrix.toString());
        getInfo(matrix);
    }

    private static void getInfo(Matrix matrix) {
        int[] temp = new int[matrix.getN()];
        for (int i = 0; i < temp.length; i++) {
            temp[i] = matrix.getElement(i, 0);
        }
        for (int i = 1; i < matrix.getM(); i++) {
            if (allInvisible(matrix.getColumn(i), temp)) {
                System.out.println("Стовпець " + (i + 1));
            }
        }
    }

    private static boolean allInvisible(int[] column, int[] temp) {
        boolean flag = true;
        int sum = 0;
        for (int i = 0; i < column.length; i++) {
            sum += column[i];
            if (temp[i] < column[i]) {
                flag = false;
                temp[i] = column[i];
            }
        }
        return (flag && (sum != 0));
    }
}
55. Матриця складається з нулів і одиниць. Знайдіть в ній найдовший ланцюжок з нулів по горизонталі, вертикалі або діагоналі.
Відповідь:
import java.util.Arrays;

public class TMat55 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(10, 1);
        System.out.println(matrix.toString());
        getInfo(matrix);
    }

    private static void getInfo(Matrix matrix) {
        int[] colZero = new int[matrix.getN() * 2 + 2];
        for (int i = 0; i < matrix.getN(); i++) {
            colZero[i] = countZero(matrix.getRow(i));
            colZero[matrix.getN() + i] = countZero(matrix.getColumn(i));
        }
        colZero[colZero.length - 2] = countZero(matrix.getMainDiagonal());
        colZero[colZero.length - 1] = countZero(matrix.getCollateralDiagonal());
        Arrays.sort(colZero);
        System.out.println("Максимальна кількість " + colZero[colZero.length - 1]);
    }


    private static int countZero(int[] mas) {
        int start = 0;
        int end = 0;
        int count = 0;
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < mas.length; i++) {
            if (mas[i] == 0) {
                count++;
            } else {
                if (count == mas.length) {
                    System.out.println("Максимальна кількість " + count);
                }
                max = check(count, max);
                count = 0;
            }
        }
        max = check(count, max);

        return max;
    }

    private static int check(int count, int max) {
        if (count > max) {
            max = count;
        }
        return max;
    }
}
56. Знайдіть всі числа в матриці, кожне з яких зустрічається в кожному рядку матриці.
Відповідь:
import java.util.ArrayList;

public class TMat56 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(2, 3);
        System.out.println(matrix.toString());
        ArrayList numb = new ArrayList();
        getInfo(matrix, numb);
        System.out.println(numb.toString());
    }

    private static void getInfo(Matrix matrix, ArrayList numb) {
        for (int j = 0; j < matrix.getM(); j++) {
            if (isInAll(matrix, matrix.getElement(0, j))) {
                numb.add(matrix.getElement(0, j));
            }
        }
    }

    private static boolean isInAll(Matrix matrix, int element) {
        boolean flag = true;
        for (int i = 1; i < matrix.getN(); i++) {
            if (!isPresent(matrix.getRow(i), element)) {
                return false;
            }
        }
        return flag;
    }

    private static boolean isPresent(int[] row, int element) {
        for (int i = 0; i < row.length; i++) {
            if (row[i] == element) {
                return true;
            }
        }
        return false;
    }
}

57. Клітинне поле розміром m x n є результатом гри в хрестики-нулики. Перевірити, чи не закінчена гра виграшем "хрестиків". Виграш настає при утворенні ланцюжка по горизонталі, вертикалі або діагоналі з 5 хрестиків поспіль.
Відповідь:
import java.util.Arrays;

public class TMat57 {
    private static int SIZE = 3;

    public static void main(String[] args) {
        Matrix matrix = new Matrix(3, 1);
        System.out.println(matrix.toString());
        if (checkMatrix(matrix)) {
            System.out.println("Перемога");
        } else {
            System.out.println("Не виграли");
        }
    }

    // перевірка рядків, стовпців та діоганалей матриці
    private static boolean checkMatrix(Matrix matrix) {
        int[] mas = new int[SIZE];

        if (checkRows(matrix)) return true;

        if (checkColumns(matrix)) return true;

        if (checkD1(matrix)) return true;

        if (checkD2(matrix)) return true;

        return false;
    }

    private static boolean checkRows(Matrix matrix) {
        int[] mas;
        for (int i = 0; i < matrix.getN(); i++) {
            for (int j = 0; j < matrix.getM() - SIZE + 1; j++) {
                mas = Arrays.copyOfRange(matrix.getRow(i), j, j + SIZE);

                if (check(mas)) {
                    System.out.println("Pobeda ryad");
                    return true;
                }
            }

        }
        return false;
    }

    private static boolean checkColumns(Matrix matrix) {
        int[] mas;
        for (int i = 0; i < matrix.getM(); i++) {

            for (int j = 0; j < matrix.getN() - SIZE + 1; j++) {
                mas = Arrays.copyOfRange(matrix.getColumn(i), j, j + SIZE);

                if (check(mas)) {
                    System.out.println("Pobeda column");
                    return true;
                }
            }
        }
        return false;
    }

    private static boolean checkD1(Matrix matrix) {
        int[] mas = new int[SIZE];

        for (int i = 0; i < matrix.getN() - SIZE + 1; i++) {
            for (int j = 0; j < matrix.getM() - SIZE + 1; j++) {
                mas = getMasD1(matrix, mas, i, j);

                if (check(mas)) {
                    System.out.println("Pobeda D1");
                    return true;
                }
            }

        }
        return false;
    }

    private static boolean checkD2(Matrix matrix) {
        int[] mas = new int[SIZE];
        for (int i = 0; i < matrix.getN() - SIZE + 1; i++) {
            for (int j = SIZE - 1; j < matrix.getM(); j++) {
                mas = getMasD2(matrix, mas, i, j);
                if (check(mas)) {
                    System.out.println("Pobeda D2");
                    return true;
                }
            }
        }
        return false;
    }

    private static int[] getMasD1(Matrix matrix, int[] mas, int i, int j) {
        for (int k = 0; k < SIZE; k++) {
            mas[k] = matrix.getElement(i + k, j + k);
        }
        return mas;
    }

    private static int[] getMasD2(Matrix matrix, int[] mas, int i, int j) {
        for (int k = 0; k < SIZE; k++) {
            mas[k] = matrix.getElement(i + k, j - k);
        }
        return mas;
    }

    private static boolean check(int[] mas) {
        int sum = 0;
        for (int i = 0; i < mas.length; i++) {
            sum += mas[i];
        }
        if (sum == SIZE) {
            return true;
        } else {
            return false;
        }
    }
}


58. У матриці, що складається з нулів і одиниць, знайдіть квадрат (квадратна подматріца) найбільшого розміру, що складається тільки з нулів.
Відповідь:
import java.util.Scanner;

public class TMat58_2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // System.out.print("n=");
        int n = 2;// scanner.nextInt();
        //System.out.print("m=");
        int m = 2;//scanner.nextInt();
        System.out.println();
        Matrix matrix = new Matrix(n, m, 0, 1);
        Matrix temp = new Matrix(n + 1, m + 1, 1, 1);
        System.out.println(matrix.toString());
        copyMatrix(matrix, temp);
        getInfo(temp);
    }

    private static void copyMatrix(Matrix matrix, Matrix temp) {
        for (int i = 0; i < matrix.getN(); i++) {
            for (int j = 0; j < matrix.getM(); j++) {
                temp.setElement(matrix.getElement(i, j), i, j);
            }
        }
    }

    private static void getInfo(Matrix matrix) {
        int maxSize = 0;
        int size = 1;
        boolean flag = false;
        for (int i = 0; i < matrix.getN(); i++) {
            for (int j = 0; j < matrix.getM(); j++) {
                if (matrix.getElement(i, j) == 0) {
                    size = getSize(matrix, i, j, size);
                    flag = true;
                }
                if (flag && (size >= maxSize)) {
                    maxSize = size;
                    size = 1;
                }

            }

        }
        System.out.println("max = " + maxSize);
    }

    private static int getSize(Matrix matrix, int i, int j, int size) {
        if (notZero(matrix, i, j, size)) {
            return size;
        } else {
            return getSize(matrix, i, j, size + 1);
        }

    }

    private static boolean notZero(Matrix matrix, int i, int j, int size) {

        if ((i + size >= matrix.getN()) || (j + size >= matrix.getM())) {

            return true;
        }
        for (int k = 0; k < size; k++) {

            if (matrix.getElement(k + i, j + size) == 1) {

                return true;
            }
        }
        for (int k = 0; k < size; k++) {
            if (matrix.getElement(i + size, k + j) == 1) {
                return true;
            }
        }
        if (matrix.getElement(i + size, j + size) == 1) {
            return true;
        }

        return false;
    }
}


59. Два рядки матриці назвемо схожими, якщо збігаються множина чисел, що зустрічаються в цих рядках. Знайдіть всі пари схожих рядків в заданій матриці.
Відповідь:
import java.util.ArrayList;
import java.util.Arrays;

public class TMat59 {
    public static void main(String[] args) {
        Matrix matrix = new Matrix(10, 5);
        System.out.println(matrix.toString());
        getInfo(matrix);
    }

    private static void getInfo(Matrix matrix) {
        ArrayList[] rows = new ArrayList[matrix.getN()];
        for (int i = 0; i < matrix.getN(); i++) {
            rows[i] = init(matrix.getRow(i));
        }

        for (int i = 0; i < rows.length - 1; i++) {
            for (int j = i + 1; j < rows.length; j++) {
                if (check(rows[i], rows[j])) {
                    System.out.println("Схожі (" + (i + 1) + "; " + (j + 1) + ")");
                }
            }
        }
    }

    private static ArrayList init(int[] row) {
        ArrayList list = new ArrayList();
        Arrays.sort(row);
        list.add(row[0]);
        for (int i = 1; i < row.length; i++) {
            if (row[i] != row[i - 1]) {
                list.add(row[i]);
            }
        }
        //  display(list);
        return list;
    }

    private static void display(ArrayList list) {
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + " ");
        }
        System.out.println();
    }

    private static boolean check(ArrayList row1, ArrayList row2) {
        if (row1.size() != row2.size()) {
            return false;
        }
        for (int i = 0; i < row1.size(); i++) {
            if (row1.get(i) != row2.get(i)) {
                return false;
            }
        }
        return true;
    }
}



Комментариев нет:

Отправить комментарий