Advertisement
Guest User

MapHandler.java

a guest
Feb 13th, 2021
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.39 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. public class MapHandler {
  4.    
  5.     private static final char [] [] markers = {
  6.             {' ', '#', ' ', '.', '$', '*', '@', '+', '%'},
  7.             {'-', '#', ' ', '.', '$', '*', '@', '+', '%'},
  8.             {' ', '#', '.', ',', 'O', 'Q', 'A', 'Y', '%'},
  9.             {' ', '#', '.', ':', '$', 'S', '@', 'a', '%'},
  10.     };
  11.     private static int markersType = 0;
  12.     private static String errorMessage;
  13.     private static int width, height, count;
  14.     private static short [] [] mazeMap, cellIndices;
  15.     private static CellVector porter;
  16.     private static CellVector [] boxVectors, targetVectors, cellVectors;
  17.    
  18.     public static boolean process (String [] mapSource) {
  19.         int k, l, minX, maxX, minY, maxY;
  20.         int [] [] tempMap;
  21.         String rowString;
  22.         int [] mapRow;
  23.         CellVector vector, newVector;
  24.         List <CellVector> boxesList, targetsList, cellsList;
  25.         Queue <CellVector> queue;
  26.         Iterator <CellVector> vectorIterator;
  27.         short cellIndex;
  28.        
  29.         errorMessage = "No errors.";
  30.         height = mapSource .length;
  31.         width  = 0;
  32.        
  33.         for (k = 0; height > k; ++k) {
  34.             maxY = mapSource [k] .length ();
  35.             if (width < maxY) {
  36.                 width = maxY;
  37.             }
  38.         }
  39.        
  40.         tempMap = new int [height + 2] [width + 2];
  41.         Arrays .fill (tempMap [0], 1);
  42.         Arrays .fill (tempMap [height + 1], 1);
  43.         maxY = width + 2;
  44.         boxesList = new ArrayList <> ();
  45.         targetsList = new ArrayList <> ();
  46.         porter = null;
  47.        
  48.         for (k = 0; height > k; ++k) {
  49.             rowString = mapSource [k];
  50.             mapRow = tempMap [k + 1];
  51.             mapRow [0] = 1;
  52.             for (l = 0; rowString .length () > l; ++l) {
  53.                 vector = new CellVector (l + 1, k + 1);
  54.                 switch (rowString .charAt (l)) {
  55.                 case '$':
  56.                     boxesList .add (vector);
  57.                     break;
  58.                 case '*':
  59.                     boxesList .add (vector);
  60.                 case '.':
  61.                     targetsList .add (vector);
  62.                     break;
  63.                 case '+':
  64.                     targetsList .add (vector);
  65.                 case '@':
  66.                     if (null != porter) {
  67.                         errorMessage = "Duplicate porter marker.";
  68.                         return false;
  69.                     }
  70.                     porter = vector;
  71.                 case '#':
  72.                     mapRow [l + 1] = 1;
  73.                 case ' ':
  74.                     break;
  75.                 default:
  76.                     errorMessage = "Unknown map marker.";
  77.                     return false;
  78.                 }
  79.             }
  80.             ++l;
  81.             for (; maxY > l; ++l) {
  82.                 mapRow [l] = 1;
  83.             }
  84.         }
  85.        
  86.         queue = new ArrayDeque <> ();
  87.         porter .setCell (tempMap, 2);
  88.         queue .add (porter);
  89.         minX = porter .getX ();
  90.         maxX = porter .getX ();
  91.         minY = porter .getY ();
  92.         maxY = porter .getY ();
  93.        
  94.         while (!queue .isEmpty ()) {
  95.             vector = queue .poll ();
  96.             for (k = 0; 4 > k; ++k) {
  97.                 newVector = vector .neighbour (k);
  98.                 switch (newVector .getCell (tempMap)) {
  99.                 case 0:
  100.                 case 4:
  101.                     newVector .setCell (tempMap, 2);
  102.                     queue .add (newVector);
  103.                     break;
  104.                 case 1:
  105.                     newVector .setCell (tempMap, 3);
  106.                     break;
  107.                 }
  108.                 if (minX > newVector .getX ()) {
  109.                     minX = newVector .getX ();
  110.                 }
  111.                 if (maxX < newVector .getX ()) {
  112.                     maxX = newVector .getX ();
  113.                 }
  114.                 if (minY > newVector .getY ()) {
  115.                     minY = newVector .getY ();
  116.                 }
  117.                 if (maxY < newVector .getY ()) {
  118.                     maxY = newVector .getY ();
  119.                 }
  120.             }
  121.             for (; 8 > k; ++k) {
  122.                 newVector = vector .neighbour (k);
  123.                 switch (newVector .getCell (tempMap)) {
  124.                 case 0:
  125.                     newVector .setCell (tempMap, 4);
  126.                     break;
  127.                 case 1:
  128.                     newVector .setCell (tempMap, 3);
  129.                     break;
  130.                 }
  131.             }
  132.         }
  133.        
  134.         vectorIterator = boxesList .iterator ();
  135.         while (vectorIterator .hasNext ()) {
  136.             if (2 != vectorIterator .next () .getCell (tempMap)) {
  137.                 vectorIterator .remove ();
  138.             }
  139.         }
  140.        
  141.         vectorIterator = targetsList .iterator ();
  142.         while (vectorIterator .hasNext ()) {
  143.             if (2 != vectorIterator .next () .getCell (tempMap)) {
  144.                 vectorIterator .remove ();
  145.             }
  146.         }
  147.        
  148.         count = boxesList .size ();
  149.         if (count != targetsList .size ()) {
  150.             errorMessage = "Box and target counts are inconsistent.";
  151.             return false;
  152.         }
  153.        
  154.         boxVectors = boxesList .toArray (new CellVector [count]);
  155.         targetVectors = targetsList .toArray (new CellVector [count]);
  156.         vector = new CellVector (-minX, -minY);
  157.         porter = porter .sumWith (vector);
  158.        
  159.         for (k = 0; count > k; ++k) {
  160.             boxVectors [k] = boxVectors [k] .sumWith (vector);
  161.             targetVectors [k] = targetVectors [k] .sumWith (vector);
  162.         }
  163.        
  164.         width = maxX - minX + 1;
  165.         height = maxY - minY + 1;
  166.         mazeMap = new short [height] [width];
  167.        
  168.         for (k = minY; maxY >= k; ++k) {
  169.             for (l = minX; maxX >= l; ++l) {
  170.                 switch (tempMap [k] [l]) {
  171.                 case 2:
  172.                     break;
  173.                 case 3:
  174.                 case 4:
  175.                     mazeMap [k - minY] [l - minX] = -1;
  176.                     break;
  177.                 default:
  178.                     mazeMap [k - minY] [l - minX] = -2;
  179.                 }
  180.             }
  181.         }
  182.        
  183.         cellIndices = makeMapCopy ();
  184.         cellsList = new ArrayList <> ();
  185.         cellIndex = 0;
  186.        
  187.         for (k = 0; height > k; ++k) {
  188.             for (l = 0; width > l; ++l) {
  189.                 vector = new CellVector (l, k);
  190.                 if (0 == vector .getCell (mazeMap)) {
  191.                     cellsList .add (vector);
  192.                     vector .setCell (cellIndices, cellIndex);
  193.                     ++cellIndex;
  194.                     if (0 > cellIndex) {
  195.                         errorMessage = "Cells count overflow.";
  196.                         return false;
  197.                     }
  198.                 }
  199.             }
  200.         }
  201.        
  202.         cellVectors = cellsList .toArray (new CellVector [cellIndex]);
  203.        
  204.         return true;
  205.     }
  206.    
  207.     private static short [] [] makeMapCopy () {
  208.         short [] [] result = new short [height] [width];
  209.         for (int k = 0; height > k; ++k) {
  210.             result [k] = Arrays .copyOf (mazeMap [k], width);
  211.         }
  212.         return result;
  213.     }
  214.    
  215.     public static String errorMessage () {
  216.         return errorMessage;
  217.     }
  218.    
  219.     public static int boxesCount () {
  220.         return count;
  221.     }
  222.    
  223.     public static int cellsCount () {
  224.         return cellVectors .length;
  225.     }
  226.    
  227.     public static short [] stateCells () {
  228.         int k;
  229.         short [] result = new short [count + 1];
  230.         for (k = 0; count > k; ++k) {
  231.             result [k] = boxVectors [k] .getCell (cellIndices);
  232.         }
  233.         result [k] = porter .getCell (cellIndices);
  234.         return result;
  235.     }
  236.    
  237.     public static short [] boxCells () {
  238.         short [] result = new short [count];
  239.         for (int k = 0; count > k; ++k) {
  240.             result [k] = boxVectors [k] .getCell (cellIndices);
  241.         }
  242.         return result;
  243.     }
  244.    
  245.     public static short [] targetCells () {
  246.         short [] result = new short [count];
  247.         for (int k = 0; count > k; ++k) {
  248.             result [k] = targetVectors [k] .getCell (cellIndices);
  249.         }
  250.         return result;
  251.     }
  252.    
  253.     public static NetworkRep networkRepresentation () {
  254.         int k, l, size;
  255.         short value;
  256.         ArrayList <Short> valuesList;
  257.         ArrayList <Integer> indicesList;
  258.         CellVector vector, nextVector;
  259.         NetworkRep result;
  260.        
  261.         valuesList  = new ArrayList <> ();
  262.         indicesList = new ArrayList <> ();
  263.        
  264.         for (k = 0; cellVectors .length > k; ++k) {
  265.             indicesList .add (valuesList .size ());
  266.             vector = cellVectors [k];
  267.             for (l = 0; 4 > l; ++l) {
  268.                 nextVector = vector .neighbour (l);
  269.                 value = nextVector .getCell (cellIndices);
  270.                 if (0 > value) {
  271.                     continue;
  272.                 }
  273.                 valuesList .add ((short) l);
  274.                 valuesList .add (value);
  275.                 valuesList .add (nextVector .neighbour (l) .getCell (cellIndices));
  276.                 valuesList .add (vector .rearNeighbour (l) .getCell (cellIndices));
  277.             }
  278.         }
  279.         indicesList .add (valuesList .size ());
  280.        
  281.         result = new NetworkRep ();
  282.         result .cellsCount       = cellVectors .length;
  283.         result .activeCellsCount = cellVectors .length;
  284.        
  285.         size = valuesList .size ();
  286.         result .values = new short [size];
  287.         for (k = 0; size > k; ++k) {
  288.             result .values [k] = valuesList .get (k);
  289.         }
  290.        
  291.         size = indicesList .size ();
  292.         result .indices = new int [size];
  293.         for (k = 0; size > k; ++k) {
  294.             result .indices [k] = indicesList .get (k);
  295.         }
  296.        
  297.         return result;
  298.     }
  299.    
  300.     public static class NetworkRep {
  301.        
  302.         private int cellsCount, activeCellsCount;
  303.         /*
  304.             values:
  305.             -   move index
  306.             -   move cell
  307.             -   next cell
  308.             -   rear cell
  309.         //*/
  310.         private short [] values;
  311.         private int   [] indices;
  312.        
  313.         public int cellsCount () {
  314.             return cellsCount;
  315.         }
  316.        
  317.         public int activeCellsCount () {
  318.             return activeCellsCount;
  319.         }
  320.        
  321.         public short [] values () {
  322.             return Arrays .copyOf (values,  values  .length);
  323.         }
  324.        
  325.         public int [] indices () {
  326.             return Arrays .copyOf (indices,  indices  .length);
  327.         }
  328.     }
  329.    
  330.     public static void setMarkersType (int type) {
  331.         if (0 <= type && markers .length > type) {
  332.             markersType = type;
  333.         }
  334.     }
  335.    
  336.     public static void displayMaze () {
  337.         int k, l;
  338.        
  339.         for (k = 0; height > k; ++k) {
  340.             for (l = 0; width > l; ++l) {
  341.                 System .out .print (markers [markersType] [2 + mazeMap [k] [l]]);
  342.             }
  343.             System .out .println ();
  344.         }
  345.         System .out .println ();
  346.     }
  347.    
  348.     public static void displayMap () {
  349.         int k, l;
  350.         short [] [] newMap;
  351.         CellVector vector;
  352.        
  353.         newMap = makeMapCopy ();
  354.        
  355.         for (k = 0; count > k; ++k) {
  356.             vector = targetVectors [k];
  357.             if (0 == vector .getCell (newMap)) {
  358.                 vector .setCell (newMap, (short) 1);
  359.             } else {
  360.                 vector .setCell (newMap, (short) 6);
  361.             }
  362.         }
  363.        
  364.         for (k = 0; height > k; ++k) {
  365.             for (l = 0; width > l; ++l) {
  366.                 System .out .print (markers [markersType] [2 + newMap [k] [l]]);
  367.             }
  368.             System .out .println ();
  369.         }
  370.         System .out .println ();
  371.     }
  372.    
  373.     public static void displayState (short [] stateCells) {
  374.         int k, l;
  375.         short [] [] newMap;
  376.         CellVector vector;
  377.        
  378.         newMap = makeMapCopy ();
  379.        
  380.         for (k = 0; count > k; ++k) {
  381.             vector = targetVectors [k];
  382.             if (0 == vector .getCell (newMap)) {
  383.                 vector .setCell (newMap, (short) 1);
  384.             } else {
  385.                 vector .setCell (newMap, (short) 6);
  386.             }
  387.         }
  388.        
  389.         for (k = 0, l = stateCells .length - 1; l > k; ++k) {
  390.             vector = cellVectors [stateCells [k]];
  391.             switch (vector .getCell (newMap)) {
  392.             case 0:
  393.                 vector .setCell (newMap, (short) 2);
  394.                 break;
  395.             case 1:
  396.                 vector .setCell (newMap, (short) 3);
  397.                 break;
  398.             default:
  399.                 vector .setCell (newMap, (short) 6);
  400.             }
  401.         }
  402.        
  403.         vector = cellVectors [stateCells [k]];
  404.         switch (vector .getCell (newMap)) {
  405.         case 0:
  406.             vector .setCell (newMap, (short) 4);
  407.             break;
  408.         case 1:
  409.             vector .setCell (newMap, (short) 5);
  410.             break;
  411.         default:
  412.             vector .setCell (newMap, (short) 6);
  413.         }
  414.        
  415.         for (k = 0; height > k; ++k) {
  416.             for (l = 0; width > l; ++l) {
  417.                 System .out .print (markers [markersType] [2 + newMap [k] [l]]);
  418.             }
  419.             System .out .println ();
  420.         }
  421.         System .out .println ();
  422.     }
  423. }
  424.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement