VirKato

AoC 2022 Day 12

Dec 12th, 2022 (edited)
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.82 KB | Source Code | 0 0
  1. package org.advent.of.code.y2022;
  2.  
  3. import java.util.*;
  4.  
  5.  
  6. public class Line12 {
  7.  
  8.     private static class Dot {
  9.         public int x, y, c;
  10.  
  11.         /***
  12.          * Клетка на карте
  13.          * @param x
  14.          * @param y
  15.          * @param c количество шагов до этой клетки
  16.          */
  17.         public Dot(int x, int y, int c) {
  18.             this.x = x;
  19.             this.y = y;
  20.             this.c = c;
  21.         }
  22.  
  23.         @Override
  24.         public boolean equals(Object o) {
  25.             if (this == o) return true;
  26.             if (!(o instanceof Dot dot)) return false;
  27.             return x == dot.x && y == dot.y;
  28.         }
  29.  
  30.         @Override
  31.         public int hashCode() {
  32.             return Objects.hash(x, y);
  33.         }
  34.     }
  35.  
  36.  
  37.     public static void main(String[] args) {
  38. //        data = test;
  39.         solution();
  40.     }
  41.  
  42.     private static final List<String> m = new ArrayList<>();
  43.     private static final Queue<Dot> dots = new LinkedList<>();
  44.     private static final Set<Dot> set = new HashSet<>();
  45.     private static int xs, ys, xe, ye;
  46.     private static int w = 0, h = 0;
  47.  
  48.  
  49.     /***
  50.      * Нужно: Пройти от S до E (S = a, E = z) по самому короткому пути.
  51.      * Условие 1: a - минимальная высота, z - максимальная высота
  52.      * Условие 2: Искать путь с минимальным перепадом высот.
  53.      *
  54.      * Задание 2: Длина пути из ближайшей пику низшей высоты.
  55.      */
  56.     private static void solution() {
  57.         Scanner in = new Scanner(data);
  58.         while (in.hasNextLine()) {
  59.             int x = 0, y = h;
  60.             String l = in.nextLine();
  61.             w = l.length();
  62.             m.add(l);
  63.             h++;
  64.             while (x < w) {
  65.                 if (isStart(x, y)) {
  66.                     xs = x; // for task 1
  67.                     ys = y; // for task 1
  68.                     set(x, y, 'a');
  69.                 }
  70.                 if (isEnd(x, y)) {
  71. //                    xe = x; // for task 1
  72. //                    ye = y; // for task 1
  73.                     xs = x; // for task 2
  74.                     ys = y; // for task 2
  75.                     set(x, y, 'z');
  76.                 }
  77.                 x++;
  78.             }
  79.         }
  80.  
  81.         dots.add(new Dot(xs, ys, 0));
  82.  
  83.         while (!dots.isEmpty()) {
  84.             Dot d = dots.poll();
  85.  
  86.             if (set.contains(d))
  87.                 continue;
  88.             set.add(d);
  89.  
  90. //            if (d.x == xe && d.y == ye) { // for task 1
  91.             if (get(d.x, d.y) == 'a') { // for task 2
  92.                 System.out.println(d.c);
  93.                 break;
  94.             }
  95.  
  96.             int[] dx = {1, 0, -1, 0};
  97.             int[] dy = {0, 1, 0, -1};
  98.             for (int i = 0; i < 4; i++) {
  99.                 int xn = d.x + dx[i], yn = d.y + dy[i];
  100.                 if (xn >= 0 && yn >= 0 && xn < w && yn < h
  101. //                        && get(xn, yn) <= get(d.x, d.y) + 1) // for task 1
  102.                         && get(xn, yn) >= get(d.x, d.y) - 1) // for task 2
  103.                     dots.add(new Dot(xn, yn, d.c + 1));
  104.             }
  105.         }
  106.     }
  107.  
  108.  
  109.     private static char get(int x, int y) {
  110.         if (x < 0 || y < 0 || x > w - 1 || y > h - 1) return '.';
  111.         return m.get(y).charAt(x);
  112.     }
  113.  
  114.  
  115.     private static void set(int x, int y, char c) {
  116.         char[] l = m.get(y).toCharArray();
  117.         l[x] = c;
  118.         m.set(y, String.valueOf(l));
  119.     }
  120.  
  121.  
  122.     private static boolean isStart(int x, int y) {
  123.         return get(x, y) == 'S';
  124.     }
  125.  
  126.  
  127.     private static boolean isEnd(int x, int y) {
  128.         return get(x, y) == 'E';
  129.     }
  130.  
  131.  
  132.     private static String test = """
  133.            Sabqponm
  134.            abcryxxl
  135.            accszExk
  136.            acctuvwj
  137.            abdefghi
  138.            """;
  139.  
  140.  
  141.     private static String data = """
  142.            abaaaaaccccccccccccccccccaaaaaaaaaaaaaccccaaaaaaaccccccccccccccccccccccccccccaaaaaa
  143.            abaaaaaaccaaaacccccccccccaaaaaaaaacaaaacaaaaaaaaaacccccccccccccccccccccccccccaaaaaa
  144.            abaaaaaacaaaaaccccccccccaaaaaaaaaaaaaaacaaaaaaaaaacccccccccccccaacccccccccccccaaaaa
  145.            abaaaaaacaaaaaacccccccccaaaaaaaaaaaaaaccaaacaaaccccccccccccccccaacccccccccccccccaaa
  146.            abccaaaccaaaaaacccaaaaccaaaaaaaaaaaaaccccaacaaacccccccccaacaccccacccccccccccccccaaa
  147.            abcccccccaaaaaccccaaaacccccaaaaacccaaaccaaaaaaccccccccccaaaaccccccccccccccccccccaac
  148.            abcccccccccaaaccccaaaacccccaaaaacccccccccaaaaaccccccccccklllllccccccccccccccccccccc
  149.            abcccccccccccccccccaaccccccccaaccccccccaaaaaaaccccccccckklllllllcccccddccccaacccccc
  150.            abaccccccccccccccccccccccccccaaccccccccaaaaaaaaccccccckkkklslllllcccddddddaaacccccc
  151.            abacccccccccccccccccccccccccccccccaaaccaaaaaaaaccccccckkkssssslllllcddddddddacccccc
  152.            abaccccccccccccccccccccccccccccccccaaaaccaaacaccccccckkksssssssslllmmmmmdddddaacccc
  153.            abcccccccccccccccaaacccccccccccccaaaaaaccaacccccccccckkkssssusssslmmmmmmmdddddacccc
  154.            abcccccccaaccccaaaaacccccccccccccaaaaaccccccaaaaaccckkkrssuuuussssqmmmmmmmmdddccccc
  155.            abcccccccaaccccaaaaaacccccccaaccccaaaaacccccaaaaacckkkkrruuuuuussqqqqqqmmmmdddccccc
  156.            abccccaaaaaaaacaaaaaacccccccaaaaccaaccaccccaaaaaacjkkkrrruuuxuuusqqqqqqqmmmmeeccccc
  157.            abcaaaaaaaaaaacaaaaaccccccaaaaaacccccaaccccaaaaajjjjrrrrruuuxxuvvvvvvvqqqmmmeeccccc
  158.            abcaacccaaaaccccaaaaaaacccaaaaacccacaaaccccaaaajjjjrrrrruuuxxxxvvvvvvvqqqmmeeeccccc
  159.            abaaaaccaaaaacccccccaaaccccaaaaacaaaaaaaacccaajjjjrrrrtuuuuxxxyvyyyvvvqqqnneeeccccc
  160.            abaaaaaaaaaaacccaaaaaaaccccaacaacaaaaaaaacccccjjjrrrttttuxxxxxyyyyyvvvqqnnneeeccccc
  161.            abaaaaaaaccaacccaaaaaaaaacccccccccaaaaaaccccccjjjrrrtttxxxxxxxyyyyyvvvqqnnneeeccccc
  162.            SbaaaaaacccccccccaaaaaaaaaccccccccaaaaacccccccjjjrrrtttxxxEzzzzyyyvvrrrnnneeecccccc
  163.            abaaaaacccccccccccaaaaaaacccccccccaaaaaaccccccjjjqqqtttxxxxxyyyyyvvvrrrnnneeecccccc
  164.            abaaacccccccccccaaaaaaaccaaccccccccccaaccaaaaajjjqqqttttxxxxyyyyyyvvrrrnnneeecccccc
  165.            abaaacccccccccccaaaaaaaccaaacaaacccccccccaaaaajjjjqqqtttttxxyywyyyywvrrnnnfeecccccc
  166.            abcaaacccccccaaaaaaaaaaacaaaaaaaccccccccaaaaaaciiiiqqqqtttxwyywwyywwwrrrnnfffcccccc
  167.            abcccccccccccaaaaaaaaaaccaaaaaacccccccccaaaaaacciiiiqqqqttwwywwwwwwwwrrrnnfffcccccc
  168.            abccccccccccccaaaaaacccaaaaaaaacccccccccaaaaaaccciiiiqqqttwwwwwswwwwrrrrnnfffcccccc
  169.            abccccccccccccaaaaaacccaaaaaaaaacccccccccaaacccccciiiqqqtswwwwssssrrrrrroofffcccccc
  170.            abccccccaaaaacaaaaaacccaaaaaaaaaaccccccccccccccccciiiqqqssswsssssssrrrrooofffaccccc
  171.            abccccccaaaaacaaccaaccccccaaacaaacccccccccccccccccciiiqqssssssspoorrrooooofffaacccc
  172.            abcccccaaaaaacccccccccccccaaacccccccccccccccccccccciiiqppssssspppooooooooffffaacccc
  173.            abcccccaaaaaacccccccccccccaacccccccccccccccccccccccciipppppppppppoooooooffffaaccccc
  174.            abcccccaaaaaaccccccccccccccccccccccccccccccccccccccciihppppppppgggggggggfffaaaccccc
  175.            abccccccaaacccccccccccccccccccccccaccccccccccccccccchhhhpppppphggggggggggfaaaaccccc
  176.            abaaaccccccccccccccccccccccaccccaaacccccccccccccccccchhhhhhhhhhgggggggggcaacccccccc
  177.            abaaccaaaccaccccccccccccccaaacccaaacaacccaaaaacccccccchhhhhhhhhgaaccccccccccccccccc
  178.            abaaacaaacaacccccccccaaaccaaaacaaaaaaaaccaaaaaccccccccchhhhhhaaaaacccccccccccccccca
  179.            abaaaccaaaaaccccccccccaaacaaaaaaaacaaaaccaaaaaaccccccccccaaacccaaaacccccccccccaccca
  180.            abcccaaaaaaccccccccccaaaaaaaaaaaaacaaaaccaaaaaaccccccccccaaaccccaaaccccccccccaaaaaa
  181.            abcccaaaaaaaacccccccaaaaaaaaaaaaaaaaaccccaaaaaacccccccccccccccccccccccccccccccaaaaa
  182.            abcccaacaaaaaccccccaaaaaaaaaaaaaaaaaaacccccaacccccccccccccccccccccccccccccccccaaaaa
  183.            """;
  184. }
  185.  
Tags: adventofcode
Add Comment
Please, Sign In to add comment