Advertisement
Sauka1337

4.4

May 19th, 2024
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.08 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. // Java program to find minimum steps to reach to
  5. // specific cell in minimum moves by Knight
  6. public class Main {
  7.  
  8.     // Class for storing a cell's data
  9.     static class cell {
  10.         int x, y;
  11.         int dis;
  12.  
  13.         public cell(int x, int y, int dis)
  14.         {
  15.             this.x = x;
  16.             this.y = y;
  17.             this.dis = dis;
  18.         }
  19.     }
  20.  
  21.     // Utility method returns true if (x, y) lies
  22.     // inside Board
  23.     static boolean isInside(int x, int y, int N, int[][] Board)
  24.     {
  25.         if (x >= 1 && x <= N && y >= 1 && y <= N && Board[x-1][y-1] != -1)
  26.             return true;
  27.         return false;
  28.     }
  29.  
  30.     // Method returns minimum step
  31.     // to reach target position
  32.     static int minStepToReachTarget(int[] knightPos,
  33.                                     int[] targetPos, int N, int[][] Board)
  34.     {
  35.         // x and y direction, where a knight can move
  36.         int[] dx = { -2, -1, 1, 2, -2, -1, 1, 2 };
  37.         int[] dy = { -1, -2, -2, -1, 1, 2, 2, 1 };
  38.  
  39.         // queue for storing states of knight in board
  40.         Queue<cell> q = new LinkedList<>();
  41.  
  42.         // push starting position of knight with 0 distance
  43.         q.add(new cell(knightPos[0], knightPos[1], 0));
  44.  
  45.         cell t;
  46.         int x, y;
  47.         boolean[][] visit = new boolean
  48.                 [N + 1][N + 1]; // default initialized to false
  49.  
  50.         // visit starting state
  51.         visit[knightPos[0]][knightPos[1]] = true;
  52.  
  53.         // loop until we have one element in queue
  54.         while (!q.isEmpty()) {
  55.             t = q.poll();
  56.  
  57.             // if current cell is equal to target cell,
  58.             // return its distance
  59.             if (t.x == targetPos[0] && t.y == targetPos[1])
  60.                 return t.dis;
  61.  
  62.             // loop for all reachable states
  63.             for (int i = 0; i < 8; i++) {
  64.                 x = t.x + dx[i];
  65.                 y = t.y + dy[i];
  66.  
  67.                 // If reachable state is not yet visited and
  68.                 // inside board, push that state into queue
  69.                 if (isInside(x, y, N, Board) && !visit[x][y]) {
  70.                     visit[x][y] = true;
  71.                     q.add(new cell(x, y, t.dis + 1));
  72.                 }
  73.             }
  74.         }
  75.         return Integer.MAX_VALUE;
  76.     }
  77.  
  78.     private static int chooseInputMethod() {
  79.         int choice;
  80.         boolean isCorrect;
  81.  
  82.         choice = -1;
  83.  
  84.         do {
  85.             System.out.println("Choose an option:");
  86.             System.out.println("1. Input data manually");
  87.             System.out.println("2. Read data from a text file");
  88.             isCorrect = true;
  89.             try {
  90.                 Scanner scanner = new Scanner(System.in);
  91.                 choice = scanner.nextInt();
  92.             } catch (NumberFormatException e) {
  93.                 System.out.println("Invalid input.");
  94.                 isCorrect = false;
  95.             }
  96.  
  97.             if (isCorrect && !(choice == 1 || choice == 2)) {
  98.                 System.out.println("Error! You have to input either 1 or 2.");
  99.                 isCorrect = false;
  100.             }
  101.         } while (!isCorrect);
  102.         return choice;
  103.     }
  104.  
  105.     private static int[] inputStartPosManually(Scanner scanner) {
  106.         System.out.println("Enter the starting position for the knight:");
  107.         int[] knightPosition= {0, 0};
  108.         boolean isCorrect;
  109.         do {
  110.             System.out.print("X1: ");
  111.             isCorrect = true;
  112.             try {
  113.                 knightPosition[0] = scanner.nextInt();
  114.             } catch (Exception e) {
  115.                 System.out.println("Invalid input.");
  116.                 isCorrect = false;
  117.                 scanner.nextLine();
  118.             }
  119.  
  120.             if (isCorrect && (knightPosition[0] < 1 || knightPosition[0] > 8)) {
  121.                 System.out.println("Please enter a value from " + 1 + " to " + 8 + "!");
  122.                 isCorrect = false;
  123.             }
  124.         } while (!isCorrect);
  125.  
  126.         do {
  127.             System.out.print("Y1: ");
  128.             isCorrect = true;
  129.             try {
  130.                 knightPosition[1] = scanner.nextInt();
  131.             } catch (Exception e) {
  132.                 System.out.println("Invalid input.");
  133.                 isCorrect = false;
  134.                 scanner.nextLine();
  135.             }
  136.  
  137.             if (isCorrect && (knightPosition[1] < 1 || knightPosition[1] > 8)) {
  138.                 System.out.println("Please enter a value from " + 1 + " to " + 8 + "!");
  139.                 isCorrect = false;
  140.             }
  141.         } while (!isCorrect);
  142.  
  143.         return knightPosition;
  144.  
  145.     }
  146.  
  147.     private static int[] inputTargetPosManually(Scanner scanner) {
  148.         System.out.println("Enter the target position for the knight:");
  149.         int[] targetPosition= {0, 0};
  150.         boolean isCorrect;
  151.         do {
  152.             System.out.print("X2: ");
  153.             isCorrect = true;
  154.             try {
  155.                 targetPosition[0] = scanner.nextInt();
  156.             } catch (Exception e) {
  157.                 System.out.println("Invalid input.");
  158.                 isCorrect = false;
  159.                 scanner.nextLine();
  160.             }
  161.  
  162.             if (isCorrect && (targetPosition[0] < 1 || targetPosition[0] > 8)) {
  163.                 System.out.println("Please enter a value from " + 1 + " to " + 8 + "!");
  164.                 isCorrect = false;
  165.             }
  166.         } while (!isCorrect);
  167.  
  168.         do {
  169.             System.out.print("Y2: ");
  170.             isCorrect = true;
  171.             try {
  172.                 targetPosition[1] = scanner.nextInt();
  173.             } catch (Exception e) {
  174.                 System.out.println("Invalid input.");
  175.                 isCorrect = false;
  176.                 scanner.nextLine();
  177.             }
  178.  
  179.             if (isCorrect && (targetPosition[1] < 1 || targetPosition[1] > 8)) {
  180.                 System.out.println("Please enter a value from " + 1 + " to " + 8 + "!");
  181.                 isCorrect = false;
  182.             }
  183.         } while (!isCorrect);
  184.  
  185.         return targetPosition;
  186.  
  187.     }
  188.     private static String findFile(Scanner scanner) {
  189.         String filePath;
  190.         boolean isCorrect;
  191.         do {
  192.             isCorrect = true;
  193.             System.out.print("Enter path to the file: ");
  194.             filePath = scanner.nextLine();
  195.             File file = new File(filePath);
  196.             if (!file.exists()) {
  197.                 isCorrect = false;
  198.                 System.out.println("File not found at the specified path.");
  199.             } else if (!filePath.endsWith(".txt")) {
  200.                 isCorrect = false;
  201.                 System.out.println("Error, wrong file type! File should have .txt extension.");
  202.             }
  203.         } while (!isCorrect);
  204.         System.out.println("File found.");
  205.         return filePath;
  206.     }
  207.     private static int[][] inputDataFromFile(String path) {
  208.         int[][] Board = new int[8][8];
  209.  
  210.         try (Scanner fileScanner = new Scanner(new File(path))) {
  211.             System.out.println("Reading file...");
  212.  
  213.             for (int i = 0; i < 8; i++){
  214.  
  215.                 String line = fileScanner.nextLine();
  216.                 String[] parts = line.split(" ");
  217.  
  218.                 for (int j = 0; j < 8; j++){
  219.                     Board[i][j] = Integer.parseInt(parts[j]);
  220.                 }
  221.             }
  222.         } catch (IOException e) {
  223.             System.out.println("Error reading file!");
  224.         }
  225.  
  226.         return Board;
  227.     }
  228.  
  229.     public static  int[][] AddPawns(Scanner scanner){
  230.         int[][] ChessBoard = new int[8][8];
  231.         int x = 0, y = 0;
  232.         boolean isCorrect;
  233.         int pawnNum = 0;
  234.  
  235.         do {
  236.             System.out.println("Input the number of pawns you want to add to the chessboard: ");
  237.             isCorrect = true;
  238.             try {
  239.                 pawnNum = scanner.nextInt();
  240.             } catch (NumberFormatException e) {
  241.                 System.out.println("Invalid input.");
  242.                 isCorrect = false;
  243.             }
  244.             if (isCorrect && (pawnNum < 0 || pawnNum > 62)) {
  245.                 System.out.println("Error! You have to input number from 0 or 62.");
  246.                 isCorrect = false;
  247.             }
  248.         } while (!isCorrect);
  249.  
  250.         for (int i = 0; i < pawnNum; i++){
  251.  
  252.             System.out.println("Input position for the pawn number " + (i+1) + ": ");
  253.  
  254.             do {
  255.                 System.out.print("X: ");
  256.                 isCorrect = true;
  257.                 try {
  258.                     x = scanner.nextInt();
  259.                 } catch (Exception e) {
  260.                     System.out.println("Invalid input.");
  261.                     isCorrect = false;
  262.                     scanner.nextLine();
  263.                 }
  264.  
  265.                 if (isCorrect && (x < 1 || x > 8)) {
  266.                     System.out.println("Please enter a value from " + 1 + " to " + 8 + "!");
  267.                     isCorrect = false;
  268.                 }
  269.             } while (!isCorrect);
  270.  
  271.             do {
  272.                 System.out.print("Y : ");
  273.                 isCorrect = true;
  274.                 try {
  275.                     y = scanner.nextInt();
  276.                 } catch (Exception e) {
  277.                     System.out.println("Invalid input.");
  278.                     isCorrect = false;
  279.                     scanner.nextLine();
  280.                 }
  281.  
  282.                 if (isCorrect && (y < 1 || y > 8)) {
  283.                     System.out.println("Please enter a value from " + 1 + " to " + 8 + "!");
  284.                     isCorrect = false;
  285.                 }
  286.             } while (!isCorrect);
  287.  
  288.             ChessBoard[x-1][y-1] = -1;
  289.  
  290.         }
  291.     return ChessBoard;
  292.     }
  293.  
  294.     // Driver code
  295.     public static void main(String[] args)
  296.     {
  297.         int N = 8;
  298.         int[] knightPos = { 0, 0 };
  299.         int[] targetPos = { 0, 0 };
  300.         int[][] ChessBoard = new int[8][8];
  301.         int minStep;
  302.  
  303.         Scanner scanner = new Scanner(System.in);
  304.  
  305.         System.out.println("This program finds shortest knight path from chess square (X1, Y1) to (X2, Y2).");
  306.  
  307.         int inputMethodChoice = chooseInputMethod();
  308.  
  309.  
  310.         if (inputMethodChoice == 1) {
  311.             knightPos = inputStartPosManually(scanner);
  312.             targetPos = inputTargetPosManually(scanner);
  313.  
  314.             ChessBoard = AddPawns(scanner);
  315.         } else if (inputMethodChoice == 2) {
  316.             String filePath = findFile(scanner);
  317.             ChessBoard = inputDataFromFile(filePath);
  318.  
  319.             for (int i = 0; i < 8; i++){
  320.                 for (int j = 0; j < 8; j++){
  321.                     if (ChessBoard[i][j] == 0) {
  322.                         knightPos[0] = i;
  323.                         knightPos[1] = j;
  324.  
  325.                     } else if (ChessBoard[i][j] == 1){
  326.                         targetPos[0] = i;
  327.                         targetPos[1] = j;
  328.                     }
  329.                 }
  330.             }
  331.         }
  332.  
  333.         // Function call
  334.         minStep = minStepToReachTarget(knightPos, targetPos, N, ChessBoard);
  335.         if (minStep > 1000){
  336.             System.out.println("Target can not be reached!");
  337.         } else {
  338.             System.out.println("Minimal number of moves needed to reach target - " + minStep);
  339.         }
  340.     }
  341.  
  342. }
  343.  
  344.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement