Advertisement
Vladislav8653

6.2 java

May 10th, 2023
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.28 KB | None | 0 0
  1. import java.io.File;
  2. import java.util.List;
  3. import java.util.Scanner;
  4.  
  5. public class Main {
  6.     public static Scanner scan = new Scanner(System.in);
  7.     static Scanner fileScanner;
  8.     public static byte[][] adjacencyMatrix = new byte[0][];
  9.     public record element(int elem, byte i) {}
  10.  
  11.     public static void main(String[] args) {
  12.         System.out.println("This program searches for the maximal path from one element to another in the matrix.");
  13.         System.out.println("Enter type of input(matrix, elements)." + '\n' + "1 is console input, 0 is file input.");
  14.         element[][] arr = inputInformation();
  15.         Graph graph = showMatrixWithLetters(arr);
  16.         System.out.println("Input start point:");
  17.         String start = getLetter(arr.length * arr[0].length);
  18.         System.out.println("Input finish point:");
  19.         String finish = getLetter(arr.length * arr[0].length);
  20.         findPaths(graph, start, finish);
  21.     }
  22.  
  23.     private static Graph showMatrixWithLetters (element[][] arr) {
  24.         adjacencyMatrix = transformMatrixToAdjacencyMatrix(arr, arr[0].length, arr.length);
  25.         Graph graph = new Graph();
  26.         char vertex = 'A';
  27.         for (int i = 0; i < arr.length; i++) {
  28.             for (int j = 0; j < arr[0].length; j++) {
  29.                 graph.addVertex(arr[i][j].elem, String.valueOf(vertex));
  30.                 vertex = (char) (vertex + 1);
  31.             }
  32.         }
  33.         final String ANSI_YELLOW = "\u001B[33m";
  34.         final String ANSI_RESET = "\u001B[0m";
  35.         vertex = 'A';
  36.         for (int i = 0; i < arr.length; i++) {
  37.             for (int j = 0; j < arr[0].length; j++) {
  38.                 System.out.print(ANSI_YELLOW + vertex + ANSI_RESET + "(" + arr[i][j].elem + ") ");
  39.                 vertex = (char) (vertex + 1);
  40.             }
  41.             System.out.println();
  42.         }
  43.         return graph;
  44.     }
  45.     private static element[][] inputInformation (){
  46.         int n, m;
  47.         element[][] arr;
  48.         String filePath;
  49.         if (choose()) {
  50.             System.out.println("Input size of matrix.");
  51.             System.out.println("Rows:");
  52.             m = inputArraySize();
  53.             System.out.println("Columns:");
  54.             n = inputArraySize();
  55.             System.out.println("Input matrix elements:");
  56.             arr = inputArray(m, n);
  57.         } else {
  58.             System.out.println("Example of file:");
  59.             System.out.println("Rows: 1");
  60.             System.out.println("Columns: 3");
  61.             System.out.println("Matrix: 12 14 234");
  62.             filePath = inputFilePath();
  63.             byte time = 0;
  64.             m = inputSizeOfArrayFromFile(filePath, time);
  65.             time++;
  66.             n = inputSizeOfArrayFromFile(filePath, time);
  67.             arr = inputArrayFile(filePath, m, n);
  68.         }
  69.         return arr;
  70.     }
  71.     private static void findPaths (Graph graph, String  start, String finish) {
  72.         List<List<String>> allPaths = graph.allPaths(start, finish);
  73.         int sum, max = 0;
  74.         System.out.println("All paths:");
  75.         for (List<String> path : allPaths) {
  76.             sum = findSum(path, graph);
  77.             if (sum > max) {
  78.                 max = sum;
  79.             }
  80.             System.out.println(path + " - " + sum);
  81.         }
  82.         System.out.println("Max path(s):");
  83.         for (List<String> path : allPaths) {
  84.             if (max == findSum(path, graph)) {
  85.                 System.out.println(path + " - " + max);
  86.             }
  87.         }
  88.     }
  89.  
  90.  
  91.     private static boolean choose() {
  92.         int inputNumber = 0;
  93.         boolean isIncorrect;
  94.         final int MIN_NUM = 0;
  95.         final int MAX_NUM = 1;
  96.         do {
  97.             isIncorrect = false;
  98.             try {
  99.                 inputNumber = Integer.parseInt(scan.nextLine());
  100.             } catch (Exception e) {
  101.                 isIncorrect = true;
  102.                 System.out.println("Please, enter a number.");
  103.             }
  104.             if (!isIncorrect && (inputNumber < MIN_NUM || inputNumber > MAX_NUM)) {
  105.                 System.out.println("You are out of input range!:");
  106.                 isIncorrect = true;
  107.             }
  108.         } while (isIncorrect);
  109.         return inputNumber == 1;
  110.     }
  111.  
  112.     private static int inputData() {
  113.         int n = 0;
  114.         boolean isIncorrect;
  115.         do {
  116.             isIncorrect = false;
  117.             try {
  118.                 n = Integer.parseInt(scan.nextLine());
  119.             } catch (Exception e) {
  120.                 isIncorrect = true;
  121.                 System.out.println("Please, enter a integer number:");
  122.             }
  123.         } while (isIncorrect);
  124.         return n;
  125.     }
  126.  
  127.     private static int findSum(List<String> vertexes, Graph graph) {
  128.         int sum = 0;
  129.         for (int i = 0; i < graph.vertexLabels.length; i++) {
  130.             if (vertexes.contains(graph.vertexLabels[i].label())) {
  131.                 sum += graph.vertexLabels[i].vertex();
  132.             }
  133.         }
  134.         return sum;
  135.     }
  136.  
  137.     private static String getLetter(int length) {
  138.         boolean isIncorrect;
  139.         String vertex;
  140.         do {
  141.             vertex = scan.nextLine();
  142.             isIncorrect = false;
  143.             if (vertex.length() > 1) {
  144.                 isIncorrect = true;
  145.                 System.out.println("Bro, just input letter of vertex.");
  146.             }
  147.             if ((vertex.charAt(0) < 'A' || vertex.charAt(0) >= (char) ('A' + length)) && !isIncorrect) {
  148.                 System.out.println("Please, enter a letter of vertex from A to " + (char) ('A' + length - 1));
  149.                 isIncorrect = true;
  150.             }
  151.         } while (isIncorrect);
  152.         return vertex;
  153.     }
  154.  
  155.     private static int inputArraySize() {
  156.         boolean isIncorrect;
  157.         final int MIN_SIZE = 1;
  158.         final int MAX_SIZE = 5;
  159.         int num;
  160.         do {
  161.             num = inputData();
  162.             isIncorrect = false;
  163.             if ((num < MIN_SIZE) || (num > MAX_SIZE)) {
  164.                 System.out.println("Please, enter a number in the range from 1 to 5:");
  165.                 isIncorrect = true;
  166.             }
  167.         } while (isIncorrect);
  168.         return num;
  169.     }
  170.  
  171.     private static element[][] inputArray(int n, int m) {
  172.         element[][] arr = new element[m][n];
  173.         byte index = 1;
  174.         for (int i = 0; i < m; i++)
  175.             for (int j = 0; j < n; j++) {
  176.                 arr[i][j] = new element(inputData(), index);
  177.                 index++;
  178.             }
  179.         return arr;
  180.     }
  181.  
  182.  
  183.  
  184.     public static byte[][] transformMatrixToAdjacencyMatrix (element[][] arr, int n, int m) {
  185.         final byte ONE = 1;
  186.         adjacencyMatrix = new byte[n*m][n*m]; //можно и boolean, но он, как и byte, 1 байт занимает
  187.         for(int i = 0; i < m; i++){
  188.             for(int j = 0; j < n; j++){
  189.                 if (i+1 < m){
  190.                     adjacencyMatrix[arr[i][j].i - 1][arr[i+1][j].i - 1] = ONE;
  191.                     adjacencyMatrix[arr[i+1][j].i - 1][arr[i][j].i - 1] = ONE;
  192.                 }
  193.                 if (i > 0){
  194.                     adjacencyMatrix[arr[i][j].i - 1][arr[i-1][j].i - 1] = ONE;
  195.                     adjacencyMatrix[arr[i-1][j].i - 1][arr[i][j].i - 1] = ONE;
  196.                 }
  197.                 if (j+1 < n){
  198.                     adjacencyMatrix[arr[i][j].i - 1][arr[i][j+1].i - 1] = ONE;
  199.                     adjacencyMatrix[arr[i][j+1].i - 1][arr[i][j].i - 1] = ONE;
  200.                 }
  201.                 if (j > 0){
  202.                     adjacencyMatrix[arr[i][j].i - 1][arr[i][j-1].i - 1] = ONE;
  203.                     adjacencyMatrix[arr[i][j-1].i - 1][arr[i][j].i - 1] = ONE;
  204.                 }
  205.             }
  206.         }
  207.         return adjacencyMatrix;
  208.     }
  209.  
  210.     private static String inputFilePath() {
  211.         String path;
  212.         boolean isIncorrect;
  213.         do {
  214.             isIncorrect = false;
  215.             System.out.println("Input file path:");
  216.             path = scan.nextLine();
  217.             File file = new File(path);
  218.             if (!file.exists()) {
  219.                 System.out.println("Wrong way to file.");
  220.                 isIncorrect = true;
  221.             }
  222.             if (!file.canRead() && file.exists()) {
  223.                 System.out.println("Impossible to read a file.");
  224.                 isIncorrect = true;
  225.             }
  226.             if (!file.canWrite() && file.canRead()) {
  227.                 System.out.println("Impossible to write a file.");
  228.                 isIncorrect = true;
  229.             }
  230.         } while (isIncorrect);
  231.         return path;
  232.     }
  233.     private static int inputSizeOfArrayFromFile(String path, byte time) {
  234.         int num = 0;
  235.         boolean isIncorrect;
  236.         final int MIN = 1;
  237.         final int MAX = 5;
  238.         do {
  239.             isIncorrect = false;
  240.             try {
  241.                 fileScanner = new Scanner(new File(path));
  242.                 if (time == 1)
  243.                     fileScanner.nextLine();
  244.                 num = fileScanner.nextInt();
  245.             } catch (Exception q) {
  246.                 isIncorrect = true;
  247.                 System.out.println("Check file.");
  248.                 path = inputFilePath();
  249.             }
  250.             if (!isIncorrect && ((num < MIN) || (num > MAX))) {
  251.                 isIncorrect = true;
  252.                 System.out.println("Array size should be in the range from 1 to 5:");
  253.                 path = inputFilePath();
  254.             }
  255.         } while (isIncorrect);
  256.         return num;
  257.     }
  258.  
  259.     private static element[][] inputArrayFile(String path, int m, int n) {
  260.         boolean isIncorrect;
  261.         element[][] arr = new element[m][n];
  262.         byte index = 1;
  263.         do {
  264.             isIncorrect = false;
  265.             try {
  266.                 fileScanner = new Scanner(new File(path));
  267.                 fileScanner.nextLine();
  268.                 fileScanner.nextLine();
  269.                 for (int i = 0; i < m; i++) {
  270.                     for (int j = 0; j < n; j++) {
  271.                         arr[i][j] = new element(Integer.parseInt(fileScanner.next()), index);
  272.                         index++;
  273.                     }
  274.                 }
  275.             } catch (Exception q) {
  276.                 isIncorrect = true;
  277.                 System.out.println("Reading of array elements failed.");
  278.                 path = inputFilePath();
  279.             }
  280.         } while (isIncorrect);
  281.         return arr;
  282.     }
  283. }
  284.  
  285. ===============================================Graph=========================================================
  286. import java.util.*;
  287. public class Graph {
  288.     public record vertexLabel (int vertex, String label) { }
  289.     public vertexLabel[] vertexLabels;
  290.     int i;
  291.  
  292.     public Graph() {
  293.         i = 0;
  294.         int zalupa = Main.adjacencyMatrix.length;
  295.         vertexLabels = new vertexLabel[Main.adjacencyMatrix.length];
  296.     }
  297.     void addVertex(int vertexIndex, String label) {
  298.         int hui = vertexLabels.length;
  299.         vertexLabels[i] = new vertexLabel(vertexIndex, label);
  300.         i++;
  301.     }
  302.     public List<List<String>> allPaths(String startLabel, String endLabel) {
  303.         List<List<String>> allPaths = new ArrayList<>();
  304.         int startIndex = -1;
  305.         int endIndex = -1;
  306.         for (int i = 0; i < vertexLabels.length; i++) {
  307.             if (Objects.equals(vertexLabels[i].label, startLabel)) {
  308.                 startIndex = i;
  309.             }
  310.             if (Objects.equals(vertexLabels[i].label, endLabel)) {
  311.                 endIndex = i;
  312.             }
  313.         }
  314.         if (startIndex == -1 || endIndex == -1) {
  315.             return allPaths;
  316.         }
  317.         List<String> currentPath = new ArrayList<>();
  318.         currentPath.add(startLabel);
  319.         allPathsDFS(startIndex, endIndex, currentPath, allPaths);
  320.         return allPaths;
  321.     }
  322.  
  323.     private void allPathsDFS(int currentIndex, int endIndex, List<String> currentPath, List<List<String>> allPaths) {
  324.         if (currentIndex == endIndex) {
  325.             allPaths.add(new ArrayList<>(currentPath));
  326.         } else {
  327.             for (int i = 0; i < Main.adjacencyMatrix[currentIndex].length; i++) {
  328.                 if (Main.adjacencyMatrix[currentIndex][i] == 1 && !currentPath.contains(vertexLabels[i].label)) {
  329.                     currentPath.add(vertexLabels[i].label);
  330.                     allPathsDFS(i, endIndex, currentPath, allPaths);
  331.                     currentPath.remove(currentPath.size() - 1);
  332.                 }
  333.             }
  334.         }
  335.     }
  336. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement