Advertisement
ksyshshot

7.1

Jun 7th, 2023
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.06 KB | Source Code | 0 0
  1. import java.io.File;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. import java.util.Scanner;
  5.  
  6. public class Main {
  7.  
  8.     public static Scanner scan = new Scanner(System.in);
  9.     public static Queue head = null;
  10.     public static Queue tail = null;
  11.  
  12.     public static void main(String[] args) {
  13.         printTask();
  14.         System.out.print("Выберите способ получения матрицы (1 - консоль, 2 - файл): ");
  15.         int choice = chooseInputOutputMethod();
  16.         int size = 0;
  17.         int[][] matrix = new int[size][size];
  18.         if (choice == 1) {
  19.             System.out.print("Введите количество вершин графа: ");
  20.             size = findSize();
  21.             matrix = findMatrixFromConsole(size);
  22.         } else {
  23.             size = findSizeFile();
  24.             matrix = findMatrixFromFile(size);
  25.         }
  26.         int startPoint = findStartPoint(size);
  27.         String output = bfsGraph(matrix, size, startPoint);
  28.         System.out.println("Порядок обхода: " + output);
  29.         System.out.print("Введите 1 для сохранения в файл, 2 - завершение программы: ");
  30.         choice = chooseInputOutputMethod();
  31.         if (choice == 1) {
  32.             outputInFile(output);
  33.         }
  34.         scan.close();
  35.     }
  36.  
  37.     public static void outputInFile(String s) {
  38.         System.out.print("Требуется файл для записи ответа. ");
  39.         String path = takePathToFile();
  40.         boolean isNotCorrect;
  41.         int i = 0;
  42.         int j = 0;
  43.         do {
  44.             isNotCorrect = false;
  45.             try (FileWriter fileWriter = new FileWriter(new File(path))) {
  46.                 fileWriter.write("Порядок обхода: " + s);
  47.             } catch (IOException ex) {
  48.                 isNotCorrect = true;
  49.                 System.out.print("Произошла ошибка записи в файл. ");
  50.             }
  51.             if (isNotCorrect) {
  52.                 System.out.println("Повторите попытку...");
  53.                 path = takePathToFile();
  54.             }
  55.         } while (isNotCorrect);
  56.     }
  57.  
  58.     public static int findSizeFile() {
  59.         String path;
  60.         boolean isNotCorrect;
  61.         boolean isEmpty = true;
  62.         int element = 0;
  63.         do {
  64.             path = takePathToFile();
  65.             isNotCorrect = false;
  66.             try (Scanner fileReader = new Scanner(new File(path))) {
  67.                 try {
  68.                     element = Integer.parseInt(fileReader.nextLine());
  69.                     if (element < 0 || element > 15) {
  70.                         isNotCorrect = true;
  71.                         System.out.println("Значение элемента должно быть от 0 до 15.");
  72.                     }
  73.                 } catch (NumberFormatException e) {
  74.                     isNotCorrect = true;
  75.                     System.out.println("Некорректно введено одно из значений в файле. Попробуйте заново.");
  76.                 }
  77.             } catch (IOException e) {
  78.                 isNotCorrect = true;
  79.                 System.out.println("Не выходит получить данные из файла. Попробуйте ещё раз.");
  80.             }
  81.         } while (isNotCorrect);
  82.         return element;
  83.     }
  84.  
  85.     public static int[][] findMatrixFromFile(int n) {
  86.         String path;
  87.         boolean isNotCorrect;
  88.         boolean isEmpty = true;
  89.         int[][] matrix = new int[n][n];
  90.         int element = 0;
  91.         do {
  92.             path = takePathToFile();
  93.             isNotCorrect = false;
  94.             try (Scanner fileReader = new Scanner(new File(path))) {
  95.                 try {
  96.                     for (int i = 0; i < n; i++) {
  97.                         for (int j = 0; j < n; j++) {
  98.                             element = fileReader.nextInt();
  99.                             if (element < 0 || element > 1) {
  100.                                 isNotCorrect = true;
  101.                             }
  102.                             matrix[i][j] = element;
  103.                         }
  104.                     }
  105.                 } catch (NumberFormatException e) {
  106.                     isNotCorrect = true;
  107.                     System.out.println("Некорректно введено одно из значений в файле. Попробуйте заново.");
  108.                 }
  109.             } catch (IOException e) {
  110.                 isNotCorrect = true;
  111.                 System.out.println("Не выходит получить данные из файла. Попробуйте ещё раз.");
  112.             }
  113.             if (isNotCorrect) {
  114.                 System.out.println("Ошибка при получении данных из файла! Повторите попытку...");
  115.             }
  116.         } while (isNotCorrect);
  117.         for (int i = 0; i < n; i++) {
  118.             for (int j = i; j < n; j++) {
  119.                 matrix[j][i] = matrix[i][j];
  120.             }
  121.         }
  122.         return matrix;
  123.     }
  124.  
  125.     public static void printTask() {
  126.         System.out.println("Данная программа осуществляет обход графа в ширину из заданной вершины.");
  127.         System.out.println("Граф задаётся матрицей смежности.");
  128.     }
  129.  
  130.     public static class Queue {
  131.         int data;
  132.         Queue next;
  133.  
  134.         public Queue(int data, Queue next) {
  135.             this.data = data;
  136.             this.next = next;
  137.         }
  138.     }
  139.  
  140.     public static void addToQueue(int value) {
  141.         Queue elem = new Queue(value, null);
  142.         if (head == null) {
  143.             head = elem;
  144.         }
  145.         if (tail != null) {
  146.             Queue last = tail;
  147.             tail = elem;
  148.             last.next = elem;
  149.         }
  150.         tail = elem;
  151.     }
  152.  
  153.     public static void removeFromQueue() {
  154.         Queue curr = head;
  155.         if (curr.next == null) {
  156.             tail = null;
  157.             head = null;
  158.         } else {
  159.             head = curr.next;
  160.         }
  161.     }
  162.  
  163.     public static int[][] findMatrixFromConsole(int n) {
  164.         boolean isIncorrect;
  165.         int[][] matrix = new int[n][n];
  166.         for (int i = 0; i < n; i++) {
  167.             for (int j = i; j < n; j++) {
  168.                 System.out.println("Введите 1, если вершины " + (i + 1) + " и " + (j + 1) + " смежны,\n0 - в противном случае");
  169.                 do {
  170.                     isIncorrect = false;
  171.                     try {
  172.                         matrix[i][j] = scan.nextInt();
  173.                         if ((matrix[i][j] > 1) || (matrix[i][j] < 0)) {
  174.                             isIncorrect = true;
  175.                             System.out.print("Необходимо ввести либо 0, либо 1. ");
  176.                         }
  177.                         if ((!isIncorrect) && ((i == j) && (matrix[i][j] == 1))) {
  178.                             isIncorrect = true;
  179.                             System.out.print("Граф не должен содержать петель. ");
  180.                         }
  181.                     } catch (Exception e) {
  182.                         isIncorrect = true;
  183.                         System.out.print("Некорректный ввод! ");
  184.                     }
  185.                     if (isIncorrect) {
  186.                         System.out.print("Повторите попытку ввода: ");
  187.                     }
  188.                 } while (isIncorrect);
  189.                 matrix[j][i] = matrix[i][j];
  190.             }
  191.         }
  192.         return matrix;
  193.     }
  194.  
  195.     public static int findSize() {
  196.         int num = 0;
  197.         boolean isIncorrect;
  198.         do {
  199.             isIncorrect = false;
  200.             try {
  201.                 num = scan.nextInt();
  202.                 if ((num > 15) || (num < 0)) {
  203.                     isIncorrect = true;
  204.                     System.out.println("Количество вершин графа должно быть от 1 до 15. Повторите ввод...");
  205.                 }
  206.             } catch (Exception e) {
  207.                 isIncorrect = true;
  208.                 System.out.println("Некорректный ввод! Повторите попытку...");
  209.             }
  210.         } while (isIncorrect);
  211.         return num;
  212.     }
  213.  
  214.     public static int chooseInputOutputMethod() {
  215.         boolean isNotCorrect;
  216.         int choice = 0;
  217.         do {
  218.             isNotCorrect = false;
  219.             try {
  220.                 choice = scan.nextInt();
  221.             } catch (NumberFormatException e) {
  222.                 System.out.println("Число введено некорректно. Повторите попытку...");
  223.                 isNotCorrect = true;
  224.             }
  225.             if ((!isNotCorrect) && (choice != 1) && (choice != 2)) {
  226.                 System.out.print("Введите либо 1, либо 2. Ваш выбор: ");
  227.                 isNotCorrect = true;
  228.             }
  229.         } while (isNotCorrect);
  230.         return choice;
  231.     }
  232.  
  233.     public static String takePathToFile() {
  234.         String path;
  235.         boolean isNotCorrect;
  236.         do {
  237.             isNotCorrect = false;
  238.             System.out.println("Введите путь к файлу: ");
  239.             path = scan.nextLine();
  240.             File file = new File(path);
  241.             if (!file.exists()) {
  242.                 System.out.println("Не удалось найти файл по заданному пути. Повторите попытку...");
  243.                 isNotCorrect = true;
  244.             }
  245.         } while (isNotCorrect);
  246.         return path;
  247.     }
  248.  
  249.     public static int findStartPoint(int n) {
  250.         System.out.print("Введите вершину, с которой хотите начать обход: ");
  251.         boolean isIncorrect;
  252.         int num = 0;
  253.         do {
  254.             isIncorrect = false;
  255.             try {
  256.                 num = scan.nextInt();
  257.                 if ((num < 1) || (num > n)) {
  258.                     isIncorrect = true;
  259.                     System.out.print("Введите существующую вершину графа: ");
  260.                 }
  261.             } catch (Exception e) {
  262.                 isIncorrect = true;
  263.                 System.out.println("Некорректные данные! Повторите попытку...");
  264.             }
  265.         } while (isIncorrect);
  266.         return num;
  267.     }
  268.  
  269.     public static String bfsGraph(int[][] matrix, int n, int start) {
  270.         boolean[] boolArr = new boolean[n];
  271.         String output = "";
  272.         for (int i = 0; i < n; i++) {
  273.             boolArr[i] = false;
  274.         }
  275.         addToQueue(start - 1);
  276.         boolArr[start - 1] = true;
  277.         while (head != null) {
  278.             output += (head.data + 1) + " ";
  279.             for (int i = 0; i < n; i++) {
  280.                 if ((!boolArr[i]) && (matrix[head.data][i] == 1)) {
  281.                     addToQueue(i);
  282.                     boolArr[i] = true;
  283.                 }
  284.             }
  285.             removeFromQueue();
  286.         }
  287.         return output;
  288.     }
  289. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement