Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.File;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.util.Scanner;
- public class Main {
- public static Scanner scan = new Scanner(System.in);
- public static Queue head = null;
- public static Queue tail = null;
- public static void main(String[] args) {
- printTask();
- System.out.print("Выберите способ получения матрицы (1 - консоль, 2 - файл): ");
- int choice = chooseInputOutputMethod();
- int size = 0;
- int[][] matrix = new int[size][size];
- if (choice == 1) {
- System.out.print("Введите количество вершин графа: ");
- size = findSize();
- matrix = findMatrixFromConsole(size);
- } else {
- size = findSizeFile();
- matrix = findMatrixFromFile(size);
- }
- int startPoint = findStartPoint(size);
- String output = bfsGraph(matrix, size, startPoint);
- System.out.println("Порядок обхода: " + output);
- System.out.print("Введите 1 для сохранения в файл, 2 - завершение программы: ");
- choice = chooseInputOutputMethod();
- if (choice == 1) {
- outputInFile(output);
- }
- scan.close();
- }
- public static void outputInFile(String s) {
- System.out.print("Требуется файл для записи ответа. ");
- String path = takePathToFile();
- boolean isNotCorrect;
- int i = 0;
- int j = 0;
- do {
- isNotCorrect = false;
- try (FileWriter fileWriter = new FileWriter(new File(path))) {
- fileWriter.write("Порядок обхода: " + s);
- } catch (IOException ex) {
- isNotCorrect = true;
- System.out.print("Произошла ошибка записи в файл. ");
- }
- if (isNotCorrect) {
- System.out.println("Повторите попытку...");
- path = takePathToFile();
- }
- } while (isNotCorrect);
- }
- public static int findSizeFile() {
- String path;
- boolean isNotCorrect;
- boolean isEmpty = true;
- int element = 0;
- do {
- path = takePathToFile();
- isNotCorrect = false;
- try (Scanner fileReader = new Scanner(new File(path))) {
- try {
- element = Integer.parseInt(fileReader.nextLine());
- if (element < 0 || element > 15) {
- isNotCorrect = true;
- System.out.println("Значение элемента должно быть от 0 до 15.");
- }
- } catch (NumberFormatException e) {
- isNotCorrect = true;
- System.out.println("Некорректно введено одно из значений в файле. Попробуйте заново.");
- }
- } catch (IOException e) {
- isNotCorrect = true;
- System.out.println("Не выходит получить данные из файла. Попробуйте ещё раз.");
- }
- } while (isNotCorrect);
- return element;
- }
- public static int[][] findMatrixFromFile(int n) {
- String path;
- boolean isNotCorrect;
- boolean isEmpty = true;
- int[][] matrix = new int[n][n];
- int element = 0;
- do {
- path = takePathToFile();
- isNotCorrect = false;
- try (Scanner fileReader = new Scanner(new File(path))) {
- try {
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- element = fileReader.nextInt();
- if (element < 0 || element > 1) {
- isNotCorrect = true;
- }
- matrix[i][j] = element;
- }
- }
- } catch (NumberFormatException e) {
- isNotCorrect = true;
- System.out.println("Некорректно введено одно из значений в файле. Попробуйте заново.");
- }
- } catch (IOException e) {
- isNotCorrect = true;
- System.out.println("Не выходит получить данные из файла. Попробуйте ещё раз.");
- }
- if (isNotCorrect) {
- System.out.println("Ошибка при получении данных из файла! Повторите попытку...");
- }
- } while (isNotCorrect);
- for (int i = 0; i < n; i++) {
- for (int j = i; j < n; j++) {
- matrix[j][i] = matrix[i][j];
- }
- }
- return matrix;
- }
- public static void printTask() {
- System.out.println("Данная программа осуществляет обход графа в ширину из заданной вершины.");
- System.out.println("Граф задаётся матрицей смежности.");
- }
- public static class Queue {
- int data;
- Queue next;
- public Queue(int data, Queue next) {
- this.data = data;
- this.next = next;
- }
- }
- public static void addToQueue(int value) {
- Queue elem = new Queue(value, null);
- if (head == null) {
- head = elem;
- }
- if (tail != null) {
- Queue last = tail;
- tail = elem;
- last.next = elem;
- }
- tail = elem;
- }
- public static void removeFromQueue() {
- Queue curr = head;
- if (curr.next == null) {
- tail = null;
- head = null;
- } else {
- head = curr.next;
- }
- }
- public static int[][] findMatrixFromConsole(int n) {
- boolean isIncorrect;
- int[][] matrix = new int[n][n];
- for (int i = 0; i < n; i++) {
- for (int j = i; j < n; j++) {
- System.out.println("Введите 1, если вершины " + (i + 1) + " и " + (j + 1) + " смежны,\n0 - в противном случае");
- do {
- isIncorrect = false;
- try {
- matrix[i][j] = scan.nextInt();
- if ((matrix[i][j] > 1) || (matrix[i][j] < 0)) {
- isIncorrect = true;
- System.out.print("Необходимо ввести либо 0, либо 1. ");
- }
- if ((!isIncorrect) && ((i == j) && (matrix[i][j] == 1))) {
- isIncorrect = true;
- System.out.print("Граф не должен содержать петель. ");
- }
- } catch (Exception e) {
- isIncorrect = true;
- System.out.print("Некорректный ввод! ");
- }
- if (isIncorrect) {
- System.out.print("Повторите попытку ввода: ");
- }
- } while (isIncorrect);
- matrix[j][i] = matrix[i][j];
- }
- }
- return matrix;
- }
- public static int findSize() {
- int num = 0;
- boolean isIncorrect;
- do {
- isIncorrect = false;
- try {
- num = scan.nextInt();
- if ((num > 15) || (num < 0)) {
- isIncorrect = true;
- System.out.println("Количество вершин графа должно быть от 1 до 15. Повторите ввод...");
- }
- } catch (Exception e) {
- isIncorrect = true;
- System.out.println("Некорректный ввод! Повторите попытку...");
- }
- } while (isIncorrect);
- return num;
- }
- public static int chooseInputOutputMethod() {
- boolean isNotCorrect;
- int choice = 0;
- do {
- isNotCorrect = false;
- try {
- choice = scan.nextInt();
- } catch (NumberFormatException e) {
- System.out.println("Число введено некорректно. Повторите попытку...");
- isNotCorrect = true;
- }
- if ((!isNotCorrect) && (choice != 1) && (choice != 2)) {
- System.out.print("Введите либо 1, либо 2. Ваш выбор: ");
- isNotCorrect = true;
- }
- } while (isNotCorrect);
- return choice;
- }
- public static String takePathToFile() {
- String path;
- boolean isNotCorrect;
- do {
- isNotCorrect = false;
- System.out.println("Введите путь к файлу: ");
- path = scan.nextLine();
- File file = new File(path);
- if (!file.exists()) {
- System.out.println("Не удалось найти файл по заданному пути. Повторите попытку...");
- isNotCorrect = true;
- }
- } while (isNotCorrect);
- return path;
- }
- public static int findStartPoint(int n) {
- System.out.print("Введите вершину, с которой хотите начать обход: ");
- boolean isIncorrect;
- int num = 0;
- do {
- isIncorrect = false;
- try {
- num = scan.nextInt();
- if ((num < 1) || (num > n)) {
- isIncorrect = true;
- System.out.print("Введите существующую вершину графа: ");
- }
- } catch (Exception e) {
- isIncorrect = true;
- System.out.println("Некорректные данные! Повторите попытку...");
- }
- } while (isIncorrect);
- return num;
- }
- public static String bfsGraph(int[][] matrix, int n, int start) {
- boolean[] boolArr = new boolean[n];
- String output = "";
- for (int i = 0; i < n; i++) {
- boolArr[i] = false;
- }
- addToQueue(start - 1);
- boolArr[start - 1] = true;
- while (head != null) {
- output += (head.data + 1) + " ";
- for (int i = 0; i < n; i++) {
- if ((!boolArr[i]) && (matrix[head.data][i] == 1)) {
- addToQueue(i);
- boolArr[i] = true;
- }
- }
- removeFromQueue();
- }
- return output;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement