Advertisement
ksyshshot

Lab.6.2

Apr 28th, 2023 (edited)
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.91 KB | Source Code | 0 0
  1. import java.io.File;
  2. import java.io.FileReader;
  3. import java.io.FileWriter;
  4. import java.io.IOException;
  5. import java.util.Scanner;
  6.  
  7. public class Main {
  8.  
  9.     public static Scanner scan = new Scanner(System.in);
  10.     public static final int MIN_NUMB = 1;
  11.     public static final int MAX_NUMB = 8;
  12.  
  13.     public static void main(String[] args) {
  14.         writeTask();
  15.         int[][] possibleMoves = {{2, -1}, {1, -2}, {2, 1}, {-2, 1}, {-1, -2}, {-1, 2}, {1, 2}, {-2, -1}};
  16.         int[][] chessDesk = new int[8][8];
  17.         int[] start = new int[2];
  18.         chessDesk = initializeDesk(chessDesk);
  19.         System.out.print("Выберите способ получения стартовых точек (1 - консоль, 2 - файл): ");
  20.         int choice = chooseInputOutputMethod();
  21.         int[] starts = takeStarts(choice);
  22.         chessDesk = makeWay(chessDesk, starts[0], starts[1], possibleMoves);
  23.         System.out.print("Выберите способ вывода пути (1 - консоль, 2 - файл): ");
  24.         choice = chooseInputOutputMethod();
  25.         outputAnswer(chessDesk, choice);
  26.     }
  27.  
  28.     public static void writeTask() {
  29.         System.out.println("Данная программа находит порядок прохождения конём всей \nшахматной доски, посещая каждую клетку по одному разу.");
  30.     }
  31.  
  32.     public static int[] takeStarts(int choice) {
  33.         int[] starts = new int[2];
  34.         if (choice == 1) {
  35.             starts = takeNumbersFromConsole();
  36.         } else {
  37.             starts = takeStartsFromFile();
  38.         }
  39.         return starts;
  40.     }
  41.  
  42.     public static void outputAnswer(int[][] answer, int choice) {
  43.         if (choice == 1) {
  44.             System.out.println("Полученный порядок:");
  45.             outputChessDeskInConsole(answer);
  46.         } else {
  47.             outputChessDeskInFile(answer);
  48.         }
  49.     }
  50.  
  51.     public static void outputChessDeskInFile(int[][] desk) {
  52.         System.out.print("Требуется файл для записи ответа. ");
  53.         String path = takePathToFile();
  54.         boolean isNotCorrect;
  55.         int i = 0;
  56.         int j = 0;
  57.         do {
  58.             isNotCorrect = false;
  59.             try (FileWriter fileWriter = new FileWriter(new File(path))) {
  60.                 while (i < desk.length) {
  61.                     j = 0;
  62.                     while (j < desk.length) {
  63.                         fileWriter.write(desk[i][j] + " ");
  64.                         j++;
  65.                     }
  66.                     fileWriter.write("\n");
  67.                     i++;
  68.                 }
  69.             } catch (IOException ex) {
  70.                 isNotCorrect = true;
  71.                 System.out.print("Произошла ошибка записи в файл. ");
  72.             }
  73.             if (isNotCorrect) {
  74.                 System.out.println("Повторите попытку...");
  75.                 path = takePathToFile();
  76.             }
  77.         } while (isNotCorrect);
  78.         System.out.println("Список сохранён в файл!");
  79.     }
  80.  
  81.     public static void outputChessDeskInConsole(int[][] desk) {
  82.         for (int i = 0; i < desk.length; i++) {
  83.             for (int j = 0; j < desk.length; j++) {
  84.                 if (desk[i][j] / 10 != 0) {
  85.                     System.out.print(desk[i][j] + " ");
  86.                 } else {
  87.                     System.out.print(" " + desk[i][j] + " ");
  88.                 }
  89.             }
  90.             System.out.println();
  91.         }
  92.     }
  93.  
  94.     public static int[] takeNumbersFromConsole() {
  95.         int[] starts = new int[2];
  96.         boolean isNotCorrect;
  97.         do {
  98.             isNotCorrect = false;
  99.             try {
  100.                 System.out.print("Введите номер стартовой строки. ");
  101.                 starts[0] = Integer.parseInt(scan.nextLine());
  102.                 System.out.print("Введите номер стартового столбца. ");
  103.                 starts[1] = Integer.parseInt(scan.nextLine());
  104.             } catch (NumberFormatException e) {
  105.                 isNotCorrect = true;
  106.                 System.out.print("Неверный формат одного из значений.");
  107.             }
  108.             if ((!isNotCorrect) && ((starts[0] > MAX_NUMB) || (starts[0] < MIN_NUMB))) {
  109.                 isNotCorrect = true;
  110.                 System.out.println("Значение одного из чисел не входит в допустимый диапазон(от " +
  111.                         MIN_NUMB + " до " + MAX_NUMB + ").");
  112.             }
  113.             if ((!isNotCorrect) && ((starts[1] > MAX_NUMB) || (starts[1] < MIN_NUMB))) {
  114.                 isNotCorrect = true;
  115.                 System.out.println("Значение одного из чисел не входит в допустимый диапазон(от " +
  116.                         MIN_NUMB + " до " + MAX_NUMB + ").");
  117.             }
  118.         } while (isNotCorrect);
  119.         starts[0]--;
  120.         starts[1]--;
  121.         return starts;
  122.     }
  123.  
  124.     public static int[][] makeWay(int[][] desk, int currX, int currY, int[][] moves) {
  125.         int i, j, k;
  126.         int currNX = 0;
  127.         int currNY = 0;
  128.         int possX = 0;
  129.         int possY = 0;
  130.         int currCount = 8;
  131.         int possCount = 8;
  132.         desk[currX][currY] = 1;
  133.         for (i = 2; i <= 64; i++) {
  134.             for (j = 0; j < 8; j++) {
  135.                 if ((currX + moves[j][0] >= 0) && (currX + moves[j][0] < 8) && (currY + moves[j][1] >= 0) && (currY + moves[j][1] < 8) && (desk[currX + moves[j][0]][currY + moves[j][1]] == 0)) {
  136.                     currCount = 0;
  137.                     currNX = currX + moves[j][0];
  138.                     currNY = currY + moves[j][1];
  139.                     for (k = 0; k < 8; k++) {
  140.                         if ((currNX + moves[k][0] >= 0) && (currNX + moves[k][0] < 8) && (currNY + moves[k][1] >= 0) && (currNY + moves[k][1] < 8) && (desk[currNX + moves[k][0]][currNY + moves[k][1]] == 0)) {
  141.                             currCount++;
  142.                         }
  143.                     }
  144.                 }
  145.                 if (possCount > currCount) {
  146.                     possX = currNX;
  147.                     possY = currNY;
  148.                     possCount = currCount;
  149.                 }
  150.             }
  151.             currX = possX;
  152.             currY = possY;
  153.             currNX = 0;
  154.             currNY = 0;
  155.             currCount = 8;
  156.             possCount = 8;
  157.             desk[currX][currY] = i;
  158.         }
  159.         return desk;
  160.     }
  161.  
  162.     public static int[][] initializeDesk(int[][] desk) {
  163.         for (int i = 0; i < desk.length; i++) {
  164.             for (int j = 0; j < desk.length; j++) {
  165.                 desk[i][j] = 0;
  166.             }
  167.         }
  168.         return desk;
  169.     }
  170.  
  171.     public static int chooseInputOutputMethod() {
  172.         boolean isNotCorrect;
  173.         int choice = 0;
  174.         do {
  175.             isNotCorrect = false;
  176.             try {
  177.                 choice = Integer.parseInt(scan.nextLine());
  178.             } catch (NumberFormatException e) {
  179.                 System.out.println("Число введено некорректно. Повторите попытку...");
  180.                 isNotCorrect = true;
  181.             }
  182.             if ((!isNotCorrect) && (choice != 1) && (choice != 2)) {
  183.                 System.out.print("Введите либо 1, либо 2. Ваш выбор: ");
  184.                 isNotCorrect = true;
  185.             }
  186.         } while (isNotCorrect);
  187.         return choice;
  188.     }
  189.  
  190.     public static String takePathToFile() {
  191.         String path;
  192.         boolean isNotCorrect;
  193.         do {
  194.             isNotCorrect = false;
  195.             System.out.print("Введите путь к файлу: ");
  196.             path = scan.nextLine();
  197.             File file = new File(path);
  198.             if (!file.exists()) {
  199.                 System.out.println("Не удалось найти файл по заданному пути. Повторите попытку...");
  200.                 isNotCorrect = true;
  201.             }
  202.         } while (isNotCorrect);
  203.         return path;
  204.     }
  205.  
  206.     public static int[] takeStartsFromFile() {
  207.         String path = takePathToFile();
  208.         boolean isNotCorrect;
  209.         int[] starts = new int[2];
  210.         do {
  211.             isNotCorrect = false;
  212.             try (Scanner fileReader = new Scanner(new File(path))) {
  213.                 try {
  214.                     starts[0] = Integer.parseInt(fileReader.nextLine());
  215.                     starts[1] = Integer.parseInt(fileReader.nextLine());
  216.                 } catch (NumberFormatException e) {
  217.                     isNotCorrect = true;
  218.                     System.out.println("Некорректно введено одно из значений в файле. ");
  219.                 }
  220.                 if ((!isNotCorrect) && ((starts[0] > MAX_NUMB) || (starts[0] < MIN_NUMB))) {
  221.                     isNotCorrect = true;
  222.                     System.out.println("Номер стартовой строки должен быть от " + MIN_NUMB + " до " + MAX_NUMB);
  223.                 }
  224.                 if ((!isNotCorrect) && ((starts[1] > MAX_NUMB) || (starts[1] < MIN_NUMB))) {
  225.                     isNotCorrect = true;
  226.                     System.out.println("Номер стартового столбца должен быть от " + MIN_NUMB + " до " + MAX_NUMB);
  227.                 }
  228.             } catch (IOException e) {
  229.                 isNotCorrect = true;
  230.                 System.out.println("Не выходит получить данные из файла. Попробуйте ещё раз.");
  231.             }
  232.             if (isNotCorrect) {
  233.                 path = takePathToFile();
  234.             }
  235.         } while (isNotCorrect);
  236.         System.out.println("Стартовая точка (строка:столбец) - " + starts[0] + ":" + starts[1]);
  237.         starts[0]--;
  238.         starts[1]--;
  239.         return starts;
  240.     }
  241. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement