Advertisement
YChalk

Plus Finder

Mar 1st, 2022 (edited)
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.79 KB | None | 0 0
  1. import java.io.*;
  2. import java.math.*;
  3. import java.security.*;
  4. import java.text.*;
  5. import java.util.*;
  6. import java.util.concurrent.*;
  7. import java.util.function.*;
  8. import java.util.regex.*;
  9. import java.util.stream.*;
  10. import static java.util.stream.Collectors.joining;
  11. import static java.util.stream.Collectors.toList;
  12.  
  13. class Result {
  14.  
  15.     /*
  16.      * Complete the 'twoPluses' function below.
  17.      *
  18.      * The function is expected to return an INTEGER.
  19.      * The function accepts STRING_ARRAY grid as parameter.
  20.      */
  21.  
  22.     public static int twoPluses(List<String> grid) {
  23.     // Write your code here
  24.     char[][] cGrid = cGrid(grid);
  25.    
  26.     ArrayList<Plus> plusses = new ArrayList<>();
  27.    
  28.     for (int i = 0; i < cGrid.length; i++){
  29.         for (int j = 0; j < cGrid[i].length; j++){
  30.             if (isGood(cGrid[i][j])){
  31.                 Point point = new Point(i, j);
  32.                 Plus plus = new Plus();
  33.                 plus.add(point);
  34.                 plus.increase(1);
  35.                 plusses.add(plus);
  36.                 int top = i;
  37.                 int bottom = i;
  38.                 int right = j;
  39.                 int left = j;
  40.                 while (true){
  41.                     top--;
  42.                     bottom++;
  43.                     right++;
  44.                     left--;
  45.                     try {                        
  46.                         if (isGood(cGrid[top][j]) &&
  47.                         isGood(cGrid[bottom][j]) &&
  48.                         isGood(cGrid[i][right]) &&
  49.                         isGood(cGrid[i][left])){
  50.                             plus.add(new Point(top, j), new Point(bottom, j), new Point(i, right), new Point(i, left));
  51.                             plus.increase(4);
  52.                             plusses.add(new Plus(plus));
  53.                         } else {
  54.                             break;
  55.                         }
  56.                     } catch (ArrayIndexOutOfBoundsException e) {
  57.                         break;
  58.                     }                    
  59.                 }                
  60.                
  61.             }
  62.         }              
  63.     }
  64.     //test
  65.     /*for (Plus plus : plusses){
  66.         System.out.println(plus);
  67.     }*/
  68.    
  69.     SizeComparator sizeComparator = new SizeComparator();
  70.     Collections.sort(plusses, sizeComparator);
  71.    
  72.     //test
  73.     /*for (Plus plus : plusses){
  74.         System.out.println(plus.size);
  75.     }*/
  76.     for (int i = plusses.size()-5; i > plusses.size()-8; i--){
  77.         //System.out.println(plusses.get(i));
  78.        
  79.         for (int j = i-1; j >= plusses.size()-8; j--){
  80.             System.out.println(plusses.get(i).overlap(plusses.get(j)));
  81.         }
  82.     }    
  83.     for (Plus p : plusses) {
  84.         if (p.size == 9){
  85.             System.out.println(p);
  86.         }
  87.     }
  88.    
  89.     int largestArea = 0;
  90.    
  91.     for (int i = plusses.size()-1; i > 0; i--){
  92.         for (int j = i-1; j >=0; j--){
  93.             if (plusses.get(i).overlap(plusses.get(j))) {
  94.                 continue;
  95.             }
  96.            
  97.             int area = plusses.get(i).size * plusses.get(j).size;
  98.             if (area > largestArea) {
  99.             largestArea = area;
  100.             }
  101.         }            
  102.     }    
  103.    
  104.     //test
  105.     /*for (Plus plus : plusses){
  106.         System.out.println(plus);
  107.     }*/
  108.    
  109.     return largestArea;
  110.  
  111.     }
  112.    
  113.     public static char[][] cGrid(List<String> grid){
  114.         char[][] cGrid = new char[grid.size()][grid.get(0).length()];
  115.         for (int i = 0; i < cGrid.length; i++){
  116.             cGrid[i] = grid.get(i).toCharArray();
  117.         }
  118.         return cGrid;
  119.     }
  120.    
  121.     public static boolean isGood(char c){
  122.         return c == 'G';
  123.     }
  124.    
  125.      
  126.     static class SizeComparator implements Comparator<Plus>{
  127.         @Override
  128.         public int compare(Plus first, Plus second){
  129.             return Integer.compare(first.size, second.size);
  130.         }
  131.     }
  132.    
  133.     public static boolean overlap(int[] first, int[] second){
  134.         return (first[1] >= second[2] || first[2] <= second[1] || first[3] >= second[4] || first[4] <= second[3]);
  135.     }
  136.    
  137.     public static int area(ArrayList<Plus> plusses){
  138.         try {
  139.             return plusses.get(plusses.size()-1).size * plusses.get(plusses.size()-2).size;
  140.         } catch (ArrayIndexOutOfBoundsException e) {
  141.             return -1;
  142.         }
  143.     }
  144.    
  145.     static class Point{
  146.         public int y;
  147.         public int x;
  148.        
  149.         public Point(int y, int x){
  150.             this.y = y;
  151.             this.x = x;
  152.         }
  153.        
  154.         @Override
  155.         public boolean equals(Object object){
  156.             Point other = (Point) object;
  157.             return (this.y == other.y && this.x == other.x);
  158.         }
  159.        
  160.         public String toString(){
  161.             return y + " " + x;
  162.         }
  163.     }
  164.    
  165.     static class Plus{
  166.         int size = 0;
  167.         ArrayList<Point> points = new ArrayList<>();
  168.        
  169.         public Plus(){}
  170.        
  171.         public Plus(Plus plus){
  172.             size = plus.size;
  173.             for (Point p : plus.points){
  174.                 points.add(p);
  175.             }
  176.         }
  177.        
  178.         public void increase(int size){
  179.             this.size += size;
  180.         }
  181.        
  182.         public void add(Point...points){
  183.             for (Point point : points)
  184.                 this.points.add(point);
  185.         }
  186.        
  187.         public boolean overlap(Plus other){
  188.             return (!Collections.disjoint(points, other.points));
  189.         }
  190.        
  191.         public String points(){
  192.             String s = "";
  193.             for (Point point : points){
  194.                 s = s + point +"\n";
  195.             }
  196.             return s;
  197.         }
  198.        
  199.         public String toString(){
  200.             return "Size: " + size + "\n Points: " + points();
  201.         }
  202.     }
  203.  
  204. }
  205.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement