Advertisement
SergeyPGUTI

11.2.2(final)

May 21st, 2016
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.18 KB | None | 0 0
  1. import java.util.ArrayDeque;
  2. import java.util.Queue;
  3. import java.util.Scanner;
  4. import java.util.Stack;
  5.  
  6. /**
  7.  * Created by Сергей on 20.05.2016.
  8.  */
  9.  
  10. public class Solution {
  11.     public static void main(String args[]) {
  12.         //задача поиск кратчайшего пути  для этого используем алгоритм поиска в ширину
  13.         //как только находим путь, поиск закончен
  14.         int n; // размер доски
  15.         int x1, x2, y1, y2; // координаты начала и конца
  16.         int x, y, dist;
  17.         int wayDist = 0;
  18.         Pair point;
  19.  
  20.         //ввод
  21.         Scanner sc = new Scanner(System.in);
  22.         n = sc.nextInt();
  23.         x1 = sc.nextInt();
  24.         y1 = sc.nextInt();
  25.         x2 = sc.nextInt();
  26.         y2 = sc.nextInt();
  27.  
  28.  
  29.         ArrayDeque<Pair> q = new ArrayDeque<Pair>();//здесь храним порядок обхода доски
  30.         int matrix[][] = new int[n][n];// шахматное поле, будем помечать пройденные точки 1, не пройденные 0
  31.         int d[][] = new int[n][n]; // ходов до точки
  32.  
  33.         for (int i = 0; i < n; i++)
  34.             for (int j = 0; j < n; j++)
  35.                 d[i][j] = -1;
  36.  
  37.         d[x1 - 1][y1 - 1] = 0;
  38.         matrix[x1 - 1][y1 - 1] = 1;
  39.         q.offer(new Pair(x1, y1));
  40.  
  41.         // поиск пути BFS
  42.         while (!q.isEmpty()) {
  43.             point = q.poll();
  44.             x = point.getX();
  45.             y = point.getY();
  46.             dist = d[x - 1][y - 1];
  47.             if (x == x2 && y == y2)
  48.                 wayDist = dist;
  49.  
  50.  
  51.             if (x + 2 <= n) {
  52.                 if (y - 1 >= 1)
  53.                     if (matrix[x + 2 - 1][y - 1 - 1] == 0) {
  54.                         q.offer(new Pair(x + 2, y - 1));//добавить в очередь
  55.                         matrix[x + 2 - 1][y - 1 - 1] = 1;// пометка на матрице
  56.                         d[x + 2 - 1][y - 1 - 1] = dist + 1;// пометить в массиве расстояний
  57.                     }
  58.                 if (y + 1 <= n)
  59.                     if (matrix[x + 2 - 1][y + 1 - 1] == 0) {
  60.                         q.offer(new Pair(x + 2, y + 1));
  61.                         matrix[x + 2 - 1][y + 1 - 1] = 1;
  62.                         d[x + 2 - 1][y + 1 - 1] = dist + 1;
  63.                     }
  64.             }
  65.             if (x - 2 >= 1) {
  66.                 if (y - 1 >= 1)
  67.                     if (matrix[x - 2 - 1][y - 1 - 1] == 0) {
  68.                         q.offer(new Pair(x - 2, y - 1));
  69.                         matrix[x - 2 - 1][y - 1 - 1] = 1;
  70.                         d[x - 2 - 1][y - 1 - 1] = dist + 1;
  71.                     }
  72.                 if (y + 1 <= n)
  73.                     if (matrix[x - 2 - 1][y + 1 - 1] == 0) {
  74.                         q.offer(new Pair(x - 2, y + 1));
  75.                         matrix[x - 2 - 1][y + 1 - 1] = 1;
  76.                         d[x - 2 - 1][y + 1 - 1] = dist + 1;
  77.                     }
  78.             }
  79.             if (y + 2 <= n) {
  80.                 if (x - 1 >= 1)
  81.                     if (matrix[x - 1 - 1][y + 2 - 1] == 0) {
  82.                         q.offer(new Pair(x - 1, y + 2));
  83.                         matrix[x - 1 - 1][y + 2 - 1] = 1;
  84.                         d[x - 1 - 1][y + 2 - 1] = dist + 1;
  85.                     }
  86.                 if (x + 1 <= n)
  87.                     if (matrix[x + 1 - 1][y + 2 - 1] == 0) {
  88.                         q.offer(new Pair(x + 1, y + 2));
  89.                         matrix[x + 1 - 1][y + 2 - 1] = 1;
  90.                         d[x + 1 - 1][y + 2 - 1] = dist + 1;
  91.                     }
  92.             }
  93.             if (y - 2 >= 1) {
  94.                 if (x - 1 >= 1)
  95.                     if (matrix[x - 1 - 1][y - 2 - 1] == 0) {
  96.                         q.offer(new Pair(x - 1, y - 2));
  97.                         matrix[x - 1 - 1][y - 2 - 1] = 1;
  98.                         d[x - 1 - 1][y - 2 - 1] = dist + 1;
  99.                     }
  100.                 if (x + 1 <= n)
  101.                     if (matrix[x + 1 - 1][y - 2 - 1] == 0) {
  102.                         matrix[x + 1 - 1][y - 2 - 1] = 1;
  103.                         q.offer(new Pair(x + 1, y - 2));
  104.                         d[x + 1 - 1][y - 2 - 1] = dist + 1;
  105.                     }
  106.             }
  107.         }
  108.         //вывести длинну пути , массив расстояний до точек
  109.         System.out.println(wayDist);
  110.         for (int i = 0; i < n; i++) {
  111.             for (int j = 0; j < n; j++)
  112.                 System.out.print(d[i][j] + " ");
  113.             System.out.println();
  114.         }
  115.         //раскрутка пути
  116.         if (wayDist > 0) {
  117.             Pair way[] = new Pair[wayDist];
  118.             way[0] = new Pair(x2, y2);
  119.             for (int i = 1; i < wayDist; i++) {
  120.                 x = way[i - 1].getX();
  121.                 y = way[i - 1].getY();
  122.                 if (x + 2 <= n) {
  123.                     if (y - 1 >= 1)
  124.                         if (d[x + 2 - 1][y - 1 - 1] == wayDist - i) {
  125.                             way[i] = new Pair(x + 2, y - 1);
  126.                             continue;
  127.                         }
  128.                     if (y + 1 <= n)
  129.                         if (d[x + 2 - 1][y + 1 - 1] == wayDist-i ) {
  130.                             way[i] = new Pair(x + 2, y + 1);
  131.                             continue;
  132.                         }
  133.                 }
  134.                 if (x - 2 >= 1) {
  135.                     if (y - 1 >= 1)
  136.                         if (d[x - 2 - 1][y - 1 - 1] == wayDist-i) {
  137.                             way[i] = new Pair(x - 2, y - 1);
  138.                             continue;
  139.                         }
  140.                     if (y + 1 <= n)    //здесь ошибка
  141.                         if (d[x - 2 - 1][y + 1 - 1] == wayDist-i) {
  142.                             way[i] = new Pair(x - 2, y + 1);
  143.                             continue;
  144.                         }
  145.                 }
  146.                 if (y + 2 <= n) {
  147.                     if (x - 1 >= 1)
  148.                         if (d[x - 1 - 1][y + 2 - 1] == wayDist-i) {
  149.                             way[i] = new Pair(x - 1, y + 2);
  150.                             continue;
  151.                         }
  152.                     if (x + 1 <= n)
  153.                         if (d[x + 1 - 1][y + 2 - 1] == wayDist-i) {
  154.                             way[i] = new Pair(x + 1, y + 2);
  155.                             continue;
  156.                         }
  157.                 }
  158.                 if (y - 2 >= 1) {
  159.                     if (x - 1 >= 1)
  160.                         if (d[x - 1 - 1][y - 2 - 1] == wayDist-i) {
  161.                             way[i] = new Pair(x - 1, y - 2);
  162.                             continue;
  163.                         }
  164.                     if (x + 1 <= n)
  165.                         if (d[x + 1 - 1][y - 2 - 1] == wayDist-i) {
  166.                             way[i] = new Pair(x + 1, y - 2);
  167.                             continue;
  168.                         }
  169.                 }
  170.             }
  171.             System.out.println(x1 + " " + y1);
  172.             for (int i = wayDist - 1; i >= 0; i--) {
  173.                 System.out.println(way[i].getX() + " " + way[i].getY());
  174.             }
  175.  
  176.         }
  177.     }
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement