Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.company;
- import com.sun.org.apache.xpath.internal.operations.Bool;
- import java.io.*;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Scanner;
- public class Main {
- static Scanner consoleScanner;
- public static int inputValue(int min, int max) {
- int ret = 0;
- Boolean isIncorrect = true;
- do {
- ret = Integer.parseInt(consoleScanner.nextLine());
- if (ret >= min && ret <= max)
- isIncorrect = false;
- else
- System.out.println("Введите число в заданном диапазоне");
- } while (isIncorrect);
- return ret;
- }
- public static int[][] userInputFromConsole() {
- int n, m;
- System.out.println("Введите размерность матрицы в диапазоне 2..100");
- n = inputValue(2, 100);
- m = inputValue(2, 100);
- return new int[n][m];
- }
- public static int[][] userInputMatrixFromConsole(int[][] matrix) {
- int n = matrix.length;
- int m = matrix[0].length;
- System.out.println("Введите элементы матрицы в диапазоне 0..1");
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- matrix[i][j] = inputValue(0, 1);
- }
- }
- return matrix;
- }
- public static int[][] userInputFromFile(String path) throws IOException {
- int n, m;
- Scanner fileScanner = new Scanner(new File(path));
- n = fileScanner.nextInt();
- m = fileScanner.nextInt();
- int[][] matrix = new int[n][m];
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- matrix[i][j] = fileScanner.nextInt();
- }
- }
- return matrix;
- }
- public static Boolean checkPath(String path) {
- File inputFile = new File(path);
- if (inputFile.exists()) {
- System.out.println(path + " найден");
- return true;
- } else {
- System.out.println(path + " не найден");
- return false;
- }
- }
- public static String userInputPath() {
- String path;
- do {
- System.out.println("Введите абсолютный путь к файлу с входными данными");
- path = consoleScanner.nextLine();
- } while (!checkPath(path));
- return path;
- }
- public static short inputMethod() {
- short method;
- System.out.println("Каким способом хотите ввести данные?");
- System.out.println("1 - с помощью консоли");
- System.out.println("2 - с помощью файла");
- do {
- method = Short.parseShort(consoleScanner.nextLine());
- if (method != 1 && method != 2)
- System.out.println("Введите 1 или 2");
- } while (method != 2 && method != 1);
- return method;
- }
- public static void printInConsole(int[][] a, int[][] b) {
- System.out.println("Исходная матрица");
- for (int i = 0; i < a.length; i++) {
- for (int j = 0; j < a[0].length; j++)
- System.out.print(a[i][j] + " ");
- System.out.println();
- }
- System.out.println();
- System.out.println("Найденная подматрица");
- for (int i = 0; i < a.length; i++) {
- for (int j = 0; j < a[0].length; j++)
- System.out.print(b[i][j] + " ");
- System.out.println();
- }
- }
- public static void printInFile(int[][] a, int[][] b, String path) throws IOException {
- FileWriter fileWriter = new FileWriter(new File(path));
- for (int i = 0; i < a.length; i++) {
- for (int j = 0; j < a[0].length; j++)
- fileWriter.write(a[i][j] + " ");
- fileWriter.write("\r\n");
- }
- fileWriter.write("\r\n");
- for (int i = 0; i < a.length; i++) {
- for (int j = 0; j < a[0].length; j++)
- fileWriter.write(b[i][j] + " ");
- fileWriter.write("\r\n");
- }
- fileWriter.close();
- System.out.println("Результат работа помещён в файл");
- }
- public static String userOutputPath() {
- String path;
- System.out.println("Введите абсолютный путь к файлу для вывода результата");
- path = consoleScanner.nextLine();
- return path;
- }
- public static short outputMethod() {
- short method;
- System.out.println("Куда хотите вывести результат?");
- System.out.println("1 - в консоль");
- System.out.println("2 - в файл");
- do {
- method = Short.parseShort(consoleScanner.nextLine());
- if (method != 1 && method != 2)
- System.out.println("Введите 1 или 2");
- } while (method != 2 && method != 1);
- return method;
- }
- public static int[][] userInput() throws IOException {
- int[][] matrix;
- short method = inputMethod();
- if (method == 1) {
- matrix = userInputFromConsole();
- matrix = userInputMatrixFromConsole(matrix);
- } else {
- String path = userInputPath();
- matrix = userInputFromFile(path);
- }
- return matrix;
- }
- public static void printResult(int[][] a, int[][] b) throws IOException {
- short method = outputMethod();
- if (method == 1)
- printInConsole(a, b);
- else {
- String path = userOutputPath();
- printInFile(a, b, path);
- }
- }
- public static int[][] findMatrix(int[][] matrix) {
- int n = matrix.length;
- int m = matrix[0].length;
- int[][] b = new int[n][m];
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++)
- b[i][j] = 0;
- }
- List<Integer> a = new ArrayList<>();
- List<Integer> x1 = new ArrayList<>();
- List<Integer> x2 = new ArrayList<>();
- List<Integer> y1 = new ArrayList<>();
- List<Integer> y2 = new ArrayList<>();
- for (int i = 0; i < n; i++)
- for (int j = 0; j < m; j++)
- if (matrix[i][j] == 1) {
- int dlin = 0;
- int minShir = 0;
- int c = i;
- int k = j;
- while (matrix[c][k] == 1) {
- int shir = 0;
- while (matrix[c][k] == 1) {
- k++;
- shir++;
- if (minShir != 0)
- if (shir > minShir) {
- shir--;
- break;
- }
- if (k == m) {
- k--;
- break;
- }
- }
- if (minShir > shir || minShir == 0)
- minShir = shir;
- dlin++;
- a.add(dlin * minShir);
- x1.add(i);
- x2.add(c);
- y1.add(j);
- y2.add(y1.get(y1.size() - 1) + minShir - 1);
- k = j;
- c++;
- if (c == n) {
- c--;
- break;
- }
- }
- }
- int maxId = 0;
- for (int i = 0; i < a.size(); i++)
- if (a.get(i) > a.get(maxId))
- maxId = i;
- for (int i = x1.get(maxId); i < x2.get(maxId) + 1; i++)
- for (int j = y1.get(maxId); j < y2.get(maxId) + 1; j++)
- b[i][j] = 1;
- return b;
- }
- public static void printTask() {
- System.out.println("Данная программа находит максимальную подматрицу из единиц");
- }
- public static void main(String[] args) throws IOException {
- consoleScanner = new Scanner(System.in);
- printTask();
- int[][] matrix = userInput();
- int[][] newMatrix = findMatrix(matrix);
- printResult(matrix,newMatrix);
- }
- }
Add Comment
Please, Sign In to add comment