Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.File;
- import java.io.FileReader;
- 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 final int MIN_NUMB = 1;
- public static final int MAX_NUMB = 8;
- public static void main(String[] args) {
- writeTask();
- int[][] possibleMoves = {{2, -1}, {1, -2}, {2, 1}, {-2, 1}, {-1, -2}, {-1, 2}, {1, 2}, {-2, -1}};
- int[][] chessDesk = new int[8][8];
- int[] start = new int[2];
- chessDesk = initializeDesk(chessDesk);
- System.out.print("Выберите способ получения стартовых точек (1 - консоль, 2 - файл): ");
- int choice = chooseInputOutputMethod();
- int[] starts = takeStarts(choice);
- chessDesk = makeWay(chessDesk, starts[0], starts[1], possibleMoves);
- System.out.print("Выберите способ вывода пути (1 - консоль, 2 - файл): ");
- choice = chooseInputOutputMethod();
- outputAnswer(chessDesk, choice);
- }
- public static void writeTask() {
- System.out.println("Данная программа находит порядок прохождения конём всей \nшахматной доски, посещая каждую клетку по одному разу.");
- }
- public static int[] takeStarts(int choice) {
- int[] starts = new int[2];
- if (choice == 1) {
- starts = takeNumbersFromConsole();
- } else {
- starts = takeStartsFromFile();
- }
- return starts;
- }
- public static void outputAnswer(int[][] answer, int choice) {
- if (choice == 1) {
- System.out.println("Полученный порядок:");
- outputChessDeskInConsole(answer);
- } else {
- outputChessDeskInFile(answer);
- }
- }
- public static void outputChessDeskInFile(int[][] desk) {
- 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))) {
- while (i < desk.length) {
- j = 0;
- while (j < desk.length) {
- fileWriter.write(desk[i][j] + " ");
- j++;
- }
- fileWriter.write("\n");
- i++;
- }
- } catch (IOException ex) {
- isNotCorrect = true;
- System.out.print("Произошла ошибка записи в файл. ");
- }
- if (isNotCorrect) {
- System.out.println("Повторите попытку...");
- path = takePathToFile();
- }
- } while (isNotCorrect);
- System.out.println("Список сохранён в файл!");
- }
- public static void outputChessDeskInConsole(int[][] desk) {
- for (int i = 0; i < desk.length; i++) {
- for (int j = 0; j < desk.length; j++) {
- if (desk[i][j] / 10 != 0) {
- System.out.print(desk[i][j] + " ");
- } else {
- System.out.print(" " + desk[i][j] + " ");
- }
- }
- System.out.println();
- }
- }
- public static int[] takeNumbersFromConsole() {
- int[] starts = new int[2];
- boolean isNotCorrect;
- do {
- isNotCorrect = false;
- try {
- System.out.print("Введите номер стартовой строки. ");
- starts[0] = Integer.parseInt(scan.nextLine());
- System.out.print("Введите номер стартового столбца. ");
- starts[1] = Integer.parseInt(scan.nextLine());
- } catch (NumberFormatException e) {
- isNotCorrect = true;
- System.out.print("Неверный формат одного из значений.");
- }
- if ((!isNotCorrect) && ((starts[0] > MAX_NUMB) || (starts[0] < MIN_NUMB))) {
- isNotCorrect = true;
- System.out.println("Значение одного из чисел не входит в допустимый диапазон(от " +
- MIN_NUMB + " до " + MAX_NUMB + ").");
- }
- if ((!isNotCorrect) && ((starts[1] > MAX_NUMB) || (starts[1] < MIN_NUMB))) {
- isNotCorrect = true;
- System.out.println("Значение одного из чисел не входит в допустимый диапазон(от " +
- MIN_NUMB + " до " + MAX_NUMB + ").");
- }
- } while (isNotCorrect);
- starts[0]--;
- starts[1]--;
- return starts;
- }
- public static int[][] makeWay(int[][] desk, int currX, int currY, int[][] moves) {
- int i, j, k;
- int currNX = 0;
- int currNY = 0;
- int possX = 0;
- int possY = 0;
- int currCount = 8;
- int possCount = 8;
- desk[currX][currY] = 1;
- for (i = 2; i <= 64; i++) {
- for (j = 0; j < 8; j++) {
- 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)) {
- currCount = 0;
- currNX = currX + moves[j][0];
- currNY = currY + moves[j][1];
- for (k = 0; k < 8; k++) {
- 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)) {
- currCount++;
- }
- }
- }
- if (possCount > currCount) {
- possX = currNX;
- possY = currNY;
- possCount = currCount;
- }
- }
- currX = possX;
- currY = possY;
- currNX = 0;
- currNY = 0;
- currCount = 8;
- possCount = 8;
- desk[currX][currY] = i;
- }
- return desk;
- }
- public static int[][] initializeDesk(int[][] desk) {
- for (int i = 0; i < desk.length; i++) {
- for (int j = 0; j < desk.length; j++) {
- desk[i][j] = 0;
- }
- }
- return desk;
- }
- public static int chooseInputOutputMethod() {
- boolean isNotCorrect;
- int choice = 0;
- do {
- isNotCorrect = false;
- try {
- choice = Integer.parseInt(scan.nextLine());
- } 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.print("Введите путь к файлу: ");
- path = scan.nextLine();
- File file = new File(path);
- if (!file.exists()) {
- System.out.println("Не удалось найти файл по заданному пути. Повторите попытку...");
- isNotCorrect = true;
- }
- } while (isNotCorrect);
- return path;
- }
- public static int[] takeStartsFromFile() {
- String path = takePathToFile();
- boolean isNotCorrect;
- int[] starts = new int[2];
- do {
- isNotCorrect = false;
- try (Scanner fileReader = new Scanner(new File(path))) {
- try {
- starts[0] = Integer.parseInt(fileReader.nextLine());
- starts[1] = Integer.parseInt(fileReader.nextLine());
- } catch (NumberFormatException e) {
- isNotCorrect = true;
- System.out.println("Некорректно введено одно из значений в файле. ");
- }
- if ((!isNotCorrect) && ((starts[0] > MAX_NUMB) || (starts[0] < MIN_NUMB))) {
- isNotCorrect = true;
- System.out.println("Номер стартовой строки должен быть от " + MIN_NUMB + " до " + MAX_NUMB);
- }
- if ((!isNotCorrect) && ((starts[1] > MAX_NUMB) || (starts[1] < MIN_NUMB))) {
- isNotCorrect = true;
- System.out.println("Номер стартового столбца должен быть от " + MIN_NUMB + " до " + MAX_NUMB);
- }
- } catch (IOException e) {
- isNotCorrect = true;
- System.out.println("Не выходит получить данные из файла. Попробуйте ещё раз.");
- }
- if (isNotCorrect) {
- path = takePathToFile();
- }
- } while (isNotCorrect);
- System.out.println("Стартовая точка (строка:столбец) - " + starts[0] + ":" + starts[1]);
- starts[0]--;
- starts[1]--;
- return starts;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement