Advertisement
Guest User

MapHandler.java

a guest
May 17th, 2021
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 24.83 KB | None | 0 0
  1. //  Sokoban brute solver.
  2. //  2021, May, B@R5uk
  3. //  Discussion: https://dxdy.ru/topic144781.html
  4.  
  5. import java.util.*;
  6.  
  7. public class MapHandler {
  8.    
  9.     private static final int CELLS_LIMIT = 10000;
  10.     private static final int
  11.             MAZE_CELL_EMPTY        =  0,
  12.             MAZE_CELL_WALL         = -1,
  13.             MAZE_CELL_UNREACHABLE  = -2,
  14.             MAZE_CELL_EMPTY_MARKED = -3,
  15.             MAZE_CELL_EMPTY_ANGLE  = -4,
  16.             MAZE_CELL_WALL_MARKED  = -5;
  17.    
  18.     private boolean initFlag;
  19.     private String errorMessage;
  20.     private int mazeWidth, mazeHeight, boxesNumber, cellsNumber, activeCellsNumber;
  21.     private int [] [] mazeMap, cellIndices;
  22.     private boolean [] [] activeCellsMap;
  23.     private CellVector porter;
  24.     private ArrayList <CellVector> boxVectors, tgtVectors, cellVectors;
  25.    
  26.     public MapHandler () {
  27.         initFlag = false;
  28.         errorMessage = "Uninitialized.";
  29.     }
  30.    
  31.     public boolean process (String [] mapLines) {
  32.        
  33.         initFlag = false;
  34.        
  35.         if (parseMapSource (mapLines)) {
  36.             return true;
  37.         }
  38.        
  39.         if (reworkMaze ()) {
  40.             return true;
  41.         }
  42.        
  43.         if (enumerateCells ()) {
  44.             return true;
  45.         }
  46.        
  47.         if (findActiveCells ()) {
  48.             return true;
  49.         }
  50.        
  51.         reenumerateCells ();
  52.        
  53.         initFlag = true;
  54.        
  55.         return false;
  56.     }
  57.    
  58.     public String getErrorMessage () {
  59.         return errorMessage;
  60.     }
  61.    
  62.     public boolean isInitialised () {
  63.         return initFlag;
  64.     }
  65.    
  66.     public int getCellsNumber () {
  67.         return cellsNumber;
  68.     }
  69.    
  70.     public int getActiveCellsNumber () {
  71.         return activeCellsNumber;
  72.     }
  73.    
  74.     public int getBoxesNumber () {
  75.         return boxesNumber;
  76.     }
  77.    
  78.     public int getMazeWidth () {
  79.         return mazeWidth;
  80.     }
  81.    
  82.     public int getMazeHeight () {
  83.         return mazeHeight;
  84.     }
  85.    
  86.     public short getPorterCell () {
  87.         return (short) porter .getCell (cellIndices);
  88.     }
  89.    
  90.     public short [] getBoxCells () {
  91.         short [] result = new short [boxesNumber];
  92.         for (int k = 0; boxesNumber > k; ++k) {
  93.             result [k] = (short) boxVectors .get (k) .getCell (cellIndices);
  94.         }
  95.         return result;
  96.     }
  97.    
  98.     public short [] getTargetCells () {
  99.         short [] result = new short [boxesNumber];
  100.         for (int k = 0; boxesNumber > k; ++k) {
  101.             result [k] = (short) tgtVectors .get (k) .getCell (cellIndices);
  102.         }
  103.         return result;
  104.     }
  105.    
  106.     public CellsAdjacency getCellsAdjacency () {
  107.         int k, l, size, value;
  108.         ArrayList <Short> valuesList;
  109.         ArrayList <Integer> indicesList;
  110.         CellVector vector, nextVector;
  111.         short [] values;
  112.         int   [] indices;
  113.        
  114.         valuesList  = new ArrayList <> ();
  115.         indicesList = new ArrayList <> ();
  116.        
  117.         size = cellVectors .size ();
  118.         for (k = 0; size > k; ++k) {
  119.             indicesList .add (valuesList .size ());
  120.             vector = cellVectors .get (k);
  121.             for (l = 0; 4 > l; ++l) {
  122.                 nextVector = vector .neighbour (l);
  123.                 value = nextVector .getCell (cellIndices);
  124.                 if (0 > value) {
  125.                     continue;
  126.                 }
  127.                 valuesList .add ((short) l);
  128.                 valuesList .add ((short) value);
  129.                 nextVector = nextVector .neighbour (l);
  130.                 if (nextVector .getCell (activeCellsMap)) {
  131.                     valuesList .add ((short) nextVector .getCell (cellIndices));
  132.                 } else {
  133.                     valuesList .add ((short) -1);
  134.                 }
  135.                 nextVector = vector .rearNeighbour (l);
  136.                 if (nextVector .getCell (activeCellsMap) && vector .getCell (activeCellsMap)) {
  137.                     valuesList .add ((short) nextVector .getCell (cellIndices));
  138.                 } else {
  139.                     valuesList .add ((short) -1);
  140.                 }
  141.             }
  142.         }
  143.         indicesList .add (valuesList .size ());
  144.        
  145.         size = valuesList .size ();
  146.         values = new short [size];
  147.         for (k = 0; size > k; ++k) {
  148.             values [k] = valuesList .get (k);
  149.         }
  150.        
  151.         size = indicesList .size ();
  152.         indices = new int [size];
  153.         for (k = 0; size > k; ++k) {
  154.             indices [k] = indicesList .get (k);
  155.         }
  156.        
  157.         return new CellsAdjacency (cellsNumber, activeCellsNumber, values, indices);
  158.     }
  159.    
  160.     //================================================================================
  161.    
  162.     private boolean parseMapSource (String [] mapSource) {
  163.         int k, l, m, value;
  164.         String rowString;
  165.         CellVector vector;
  166.        
  167.         errorMessage = "No errors.";
  168.         mazeHeight = mapSource .length;
  169.         mazeWidth  = 0;
  170.        
  171.         for (k = 0; mazeHeight > k; ++k) {
  172.             value = mapSource [k] .length ();
  173.             if (mazeWidth < value) {
  174.                 mazeWidth = value;
  175.             }
  176.         }
  177.        
  178.         value = mazeWidth + 2;
  179.         mazeMap = new int [mazeHeight + 2] [value];
  180.         Arrays .fill (mazeMap [0],              MAZE_CELL_WALL);
  181.         Arrays .fill (mazeMap [mazeHeight + 1], MAZE_CELL_WALL);
  182.         porter = null;
  183.         boxVectors = new ArrayList <> ();
  184.         tgtVectors = new ArrayList <> ();
  185.        
  186.         for (k = 1; mazeHeight >= k; ++k) {
  187.             rowString = mapSource [k - 1];
  188.             mazeMap [k] [0] = MAZE_CELL_WALL;
  189.             for (l = 0, m = 1; rowString .length () > l; l = m, ++m) {
  190.                 vector = new CellVector (m, k);
  191.                 vector .setCell (mazeMap, MAZE_CELL_EMPTY);
  192.                 switch (rowString .charAt (l)) {
  193.                 case '$':
  194.                     boxVectors .add (vector);
  195.                     break;
  196.                 case '*':
  197.                     boxVectors .add (vector);
  198.                 case '.':
  199.                     tgtVectors .add (vector);
  200.                     break;
  201.                 case '+':
  202.                     tgtVectors .add (vector);
  203.                 case '@':
  204.                     if (null != porter) {
  205.                         errorMessage = "Duplicate porter marker.";
  206.                         return true;
  207.                     }
  208.                     porter = vector;
  209.                     break;
  210.                 case '#':
  211.                     vector .setCell (mazeMap, MAZE_CELL_WALL);
  212.                 case ' ':
  213.                     break;
  214.                 default:
  215.                     errorMessage = "Unknown map marker.";
  216.                     return true;
  217.                 }
  218.             }
  219.             ++l;
  220.             for (; value > l; ++l) {
  221.                 mazeMap [k] [l] = MAZE_CELL_WALL;
  222.             }
  223.         }
  224.        
  225.         return false;
  226.     }
  227.    
  228.     //================================================================================
  229.    
  230.     private boolean reworkMaze () {
  231.         int k, l, m, n, minX, maxX, minY, maxY;
  232.         Queue <CellVector> queue;
  233.         CellVector vector, newVector;
  234.         Iterator <CellVector> vectorIterator;
  235.         int [] [] oldMap;
  236.        
  237.         queue = new ArrayDeque <> ();
  238.         porter .setCell (mazeMap, MAZE_CELL_EMPTY_MARKED);
  239.         queue .add (porter);
  240.         minX = porter .getX ();
  241.         maxX = porter .getX ();
  242.         minY = porter .getY ();
  243.         maxY = porter .getY ();
  244.        
  245.         while (!queue .isEmpty ()) {
  246.             vector = queue .poll ();
  247.             for (k = 0; 4 > k; ++k) {
  248.                 newVector = vector .neighbour (k);
  249.                 switch (newVector .getCell (mazeMap)) {
  250.                 case MAZE_CELL_EMPTY:
  251.                 case MAZE_CELL_EMPTY_ANGLE:
  252.                     newVector .setCell (mazeMap, MAZE_CELL_EMPTY_MARKED);
  253.                     queue .add (newVector);
  254.                     break;
  255.                 case MAZE_CELL_WALL:
  256.                     newVector .setCell (mazeMap, MAZE_CELL_WALL_MARKED);
  257.                 case MAZE_CELL_WALL_MARKED:
  258.                 case MAZE_CELL_EMPTY_MARKED:
  259.                     break;
  260.                 default:
  261.                     throw new IllegalArgumentException ("\n\nImpossible error: unknown maze cell type.\n");
  262.                 }
  263.                 if (minX > newVector .getX ()) {
  264.                     minX = newVector .getX ();
  265.                 }
  266.                 if (maxX < newVector .getX ()) {
  267.                     maxX = newVector .getX ();
  268.                 }
  269.                 if (minY > newVector .getY ()) {
  270.                     minY = newVector .getY ();
  271.                 }
  272.                 if (maxY < newVector .getY ()) {
  273.                     maxY = newVector .getY ();
  274.                 }
  275.             }
  276.             for (; 8 > k; ++k) {
  277.                 newVector = vector .neighbour (k);
  278.                 switch (newVector .getCell (mazeMap)) {
  279.                 case MAZE_CELL_EMPTY:
  280.                     newVector .setCell (mazeMap, MAZE_CELL_EMPTY_ANGLE);
  281.                     break;
  282.                 case MAZE_CELL_WALL:
  283.                     newVector .setCell (mazeMap, MAZE_CELL_WALL_MARKED);
  284.                 case MAZE_CELL_WALL_MARKED:
  285.                 case MAZE_CELL_EMPTY_MARKED:
  286.                 case MAZE_CELL_EMPTY_ANGLE:
  287.                     break;
  288.                 default:
  289.                     throw new IllegalArgumentException ("\n\nImpossible error: unknown maze cell type.\n");
  290.                 }
  291.             }
  292.         }
  293.        
  294.         vectorIterator = boxVectors .iterator ();
  295.         while (vectorIterator .hasNext ()) {
  296.             if (MAZE_CELL_EMPTY_MARKED != vectorIterator .next () .getCell (mazeMap)) {
  297.                 vectorIterator .remove ();
  298.             }
  299.         }
  300.        
  301.         vectorIterator = tgtVectors .iterator ();
  302.         while (vectorIterator .hasNext ()) {
  303.             if (MAZE_CELL_EMPTY_MARKED != vectorIterator .next () .getCell (mazeMap)) {
  304.                 vectorIterator .remove ();
  305.             }
  306.         }
  307.        
  308.         boxesNumber = boxVectors .size ();
  309.         if (boxesNumber != tgtVectors .size ()) {
  310.             errorMessage = "Numbers of reachable boxes and targets do not agree.";
  311.             return true;
  312.         }
  313.        
  314.         vector = new CellVector (-minX, -minY);
  315.         porter = porter .sumWith (vector);
  316.        
  317.         for (k = 0; boxesNumber > k; ++k) {
  318.             boxVectors .set (k, boxVectors .get (k) .sumWith (vector));
  319.             tgtVectors .set (k, tgtVectors .get (k) .sumWith (vector));
  320.         }
  321.        
  322.         mazeWidth  = maxX - minX + 1;
  323.         mazeHeight = maxY - minY + 1;
  324.         oldMap  = mazeMap;
  325.         mazeMap = new int [mazeHeight] [mazeWidth];
  326.        
  327.         for (k = minY, m = 0; maxY >= k; ++k, ++m) {
  328.             for (l = minX, n = 0; maxX >= l; ++l, ++n) {
  329.                 switch (oldMap [k] [l]) {
  330.                 case MAZE_CELL_WALL:
  331.                 case MAZE_CELL_EMPTY:
  332.                     mazeMap [m] [n] = MAZE_CELL_UNREACHABLE;
  333.                     break;
  334.                 case MAZE_CELL_WALL_MARKED:
  335.                 case MAZE_CELL_EMPTY_ANGLE:
  336.                     mazeMap [m] [n] = MAZE_CELL_WALL;
  337.                     break;
  338.                 case MAZE_CELL_EMPTY_MARKED:
  339.                     mazeMap [m] [n] = MAZE_CELL_EMPTY;
  340.                     break;
  341.                 default:
  342.                     throw new IllegalArgumentException ("\n\nImpossible error: unknown maze cell type.\n");
  343.                 }
  344.             }
  345.         }
  346.        
  347.         /*
  348.         System .out .println ();
  349.         boxVectors .forEach (p -> System .out .println (p .toString ()));
  350.         System .out .println ();
  351.         tgtVectors .forEach (p -> System .out .println (p .toString ()));
  352.         //*/
  353.        
  354.         return false;
  355.     }
  356.    
  357.     //================================================================================
  358.    
  359.     private boolean enumerateCells () {
  360.         int k, l;
  361.         CellVector vector;
  362.        
  363.         cellIndices = new int [mazeHeight] [mazeWidth];
  364.         cellVectors = new ArrayList <> ();
  365.         cellsNumber = 0;
  366.        
  367.         for (k = 0; mazeHeight > k; ++k) {
  368.             for (l = 0; mazeWidth > l; ++l) {
  369.                 vector = new CellVector (l, k);
  370.                 switch (vector .getCell (mazeMap)) {
  371.                 case MAZE_CELL_EMPTY:
  372.                     vector .setCell (cellIndices, cellsNumber);
  373.                     ++cellsNumber;
  374.                     if (CELLS_LIMIT < cellsNumber) {
  375.                         errorMessage = "Number of cells exceeds limit.";
  376.                         return true;
  377.                     }
  378.                     cellVectors .add (vector);
  379.                     break;
  380.                 case MAZE_CELL_WALL:
  381.                 case MAZE_CELL_UNREACHABLE:
  382.                     vector .setCell (cellIndices, -1);
  383.                     break;
  384.                 default:
  385.                     throw new IllegalArgumentException ("\n\nImpossible error: unknown maze cell type.\n");
  386.                 }
  387.             }
  388.         }
  389.        
  390.         return false;
  391.     }
  392.    
  393.     //================================================================================
  394.    
  395.     private boolean findActiveCells () {
  396.         int k, l;
  397.         boolean [] forwardFlags, backwardFlags;
  398.         boolean [] [] stateFlags;
  399.         Queue <SingleBoxState> queue;
  400.         SingleBoxState state, newState;
  401.         CellVector porterVector, boxVector, newPorterVector, newBoxVector, vector;
  402.        
  403.         forwardFlags  = new boolean [cellsNumber];
  404.         stateFlags    = new boolean [cellsNumber] [cellsNumber];
  405.         queue = new ArrayDeque <> ();
  406.        
  407.         for (k = 0; boxesNumber > k; ++k) {
  408.             state = new SingleBoxState (
  409.                             porter              .getCell (cellIndices),
  410.                             boxVectors .get (k) .getCell (cellIndices));
  411.             queue .add (state);
  412.             state .flagState (stateFlags);
  413.             state .flagBox (forwardFlags);
  414.         }
  415.        
  416.         while (!queue .isEmpty ()) {
  417.             state = queue .poll ();
  418.             //System .out .println ("State: " + state .porter + ", " + state .box);
  419.             porterVector = cellVectors .get (state .porter);
  420.             boxVector    = cellVectors .get (state .box);
  421.             for (k = 0; 4 > k; ++k) {
  422.                 newPorterVector = porterVector .neighbour (k);
  423.                 if (MAZE_CELL_EMPTY != newPorterVector .getCell (mazeMap)) {
  424.                     continue;
  425.                 }
  426.                 if (boxVector .equals (newPorterVector)) {
  427.                     newBoxVector = boxVector .neighbour (k);
  428.                     if (MAZE_CELL_EMPTY != newBoxVector .getCell (mazeMap)) {
  429.                         continue;
  430.                     }
  431.                 } else {
  432.                     newBoxVector = boxVector;
  433.                 }
  434.                 newState = new SingleBoxState (
  435.                                     newPorterVector .getCell (cellIndices),
  436.                                     newBoxVector    .getCell (cellIndices));
  437.                 if (newState .isStateFlagged (stateFlags)) {
  438.                     continue;
  439.                 }
  440.                 queue .add (newState);
  441.                 newState .flagState (stateFlags);
  442.                 newState .flagBox (forwardFlags);
  443.             }
  444.         }
  445.        
  446.         //displayMazeFlagged (forwardFlags);
  447.        
  448.         backwardFlags = new boolean [cellsNumber];
  449.         stateFlags    = new boolean [cellsNumber] [cellsNumber];
  450.         queue = new ArrayDeque <> ();
  451.        
  452.         for (k = 0; boxesNumber > k; ++k) {
  453.             boxVector = tgtVectors .get (k);
  454.             for (l = 0; 4 > l; ++l) {
  455.                 porterVector = boxVector .neighbour (l);
  456.                 if (MAZE_CELL_EMPTY != porterVector .getCell (mazeMap)) {
  457.                     continue;
  458.                 }
  459.                 state = new SingleBoxState (
  460.                                 porterVector .getCell (cellIndices),
  461.                                 boxVector    .getCell (cellIndices));
  462.                 queue .add (state);
  463.                 state .flagState (stateFlags);
  464.                 state .flagBox (backwardFlags);
  465.             }
  466.         }
  467.        
  468.         while (!queue .isEmpty ()) {
  469.             state = queue .poll ();
  470.             //System .out .println ("State: " + state .porter + ", " + state .box);
  471.             porterVector = cellVectors .get (state .porter);
  472.             boxVector    = cellVectors .get (state .box);
  473.             for (k = 0; 4 > k; ++k) {
  474.                 newPorterVector = porterVector .neighbour (k);
  475.                 if (MAZE_CELL_EMPTY != newPorterVector .getCell (mazeMap)) {
  476.                     continue;
  477.                 }
  478.                 if (boxVector .equals (newPorterVector)) {
  479.                     continue;
  480.                 }
  481.                 newState = new SingleBoxState (
  482.                                     newPorterVector .getCell (cellIndices),
  483.                                     boxVector       .getCell (cellIndices));
  484.                 if (!newState .isStateFlagged (stateFlags)) {
  485.                     queue .add (newState);
  486.                     newState .flagState (stateFlags);
  487.                     //System .out .println ("  new state: " + newState .porter + ", " + newState .box);
  488.                 }
  489.                 newBoxVector = boxVector .neighbour (k);
  490.                 if (!porterVector .equals (newBoxVector)) {
  491.                     continue;
  492.                 }
  493.                 newState = new SingleBoxState (
  494.                                     newPorterVector .getCell (cellIndices),
  495.                                     newBoxVector    .getCell (cellIndices));
  496.                 if (newState .isStateFlagged (stateFlags)) {
  497.                     continue;
  498.                 }
  499.                 queue .add (newState);
  500.                 newState .flagState (stateFlags);
  501.                 newState .flagBox (backwardFlags);
  502.                 //System .out .println ("  new state: " + newState .porter + ", " + newState .box + " *");
  503.             }
  504.         }
  505.        
  506.         //displayMazeFlagged (backwardFlags);
  507.        
  508.         activeCellsMap = new boolean [mazeHeight] [mazeWidth];
  509.        
  510.         for (k = 0; cellsNumber > k; ++k) {
  511.             vector = cellVectors .get (k);
  512.             vector .setCell (activeCellsMap, forwardFlags [k] && backwardFlags [k]);
  513.         }
  514.        
  515.         //displayMazeActiveCells ();
  516.        
  517.         for (k = 0; boxesNumber > k; ++k) {
  518.             if (!boxVectors .get (k) .getCell (activeCellsMap)) {
  519.                 errorMessage = "Some boxes are placed in dead cells.";
  520.                 return true;
  521.             }
  522.             if (!tgtVectors .get (k) .getCell (activeCellsMap)) {
  523.                 errorMessage = "Some target cells are unreachable by boxes.";
  524.                 return true;
  525.             }
  526.         }
  527.        
  528.         return false;
  529.     }
  530.    
  531.     //================================================================================
  532.    
  533.     private class SingleBoxState {
  534.        
  535.         public int porter, box;
  536.        
  537.         public SingleBoxState (int porter, int box) {
  538.             this .porter = porter;
  539.             this .box    = box;
  540.         }
  541.        
  542.         public void flagState (boolean [] [] stateFlags) {
  543.             stateFlags [porter] [box] = true;
  544.         }
  545.        
  546.         public boolean isStateFlagged (boolean [] [] stateFlags) {
  547.             return stateFlags [porter] [box];
  548.         }
  549.        
  550.         public void flagBox (boolean [] boxFlags) {
  551.             boxFlags [box] = true;
  552.         }
  553.     }
  554.    
  555.     //================================================================================
  556.    
  557.     private void reenumerateCells () {
  558.         int k, l, index;
  559.         CellVector vector;
  560.        
  561.         cellIndices = new int [mazeHeight] [mazeWidth];
  562.         cellVectors = new ArrayList <> ();
  563.         index = 0;
  564.        
  565.         for (k = 0; mazeHeight > k; ++k) {
  566.             for (l = 0; mazeWidth > l; ++l) {
  567.                 vector = new CellVector (l, k);
  568.                 if (!vector .getCell (activeCellsMap)) {
  569.                     continue;
  570.                 }
  571.                 vector .setCell (cellIndices, index);
  572.                 ++index;
  573.                 cellVectors .add (vector);
  574.             }
  575.         }
  576.        
  577.         activeCellsNumber = index;
  578.        
  579.         for (k = 0; mazeHeight > k; ++k) {
  580.             for (l = 0; mazeWidth > l; ++l) {
  581.                 vector = new CellVector (l, k);
  582.                 switch (vector .getCell (mazeMap)) {
  583.                 case MAZE_CELL_EMPTY:
  584.                     if (!vector .getCell (activeCellsMap)) {
  585.                         vector .setCell (cellIndices, index);
  586.                         ++index;
  587.                         cellVectors .add (vector);
  588.                     }
  589.                     break;
  590.                 case MAZE_CELL_WALL:
  591.                 case MAZE_CELL_UNREACHABLE:
  592.                     vector .setCell (cellIndices, -1);
  593.                     break;
  594.                 default:
  595.                     throw new IllegalArgumentException ("\n\nImpossible error: unknown maze cell type.\n");
  596.                 }
  597.             }
  598.         }
  599.     }
  600.    
  601.     //================================================================================
  602.    
  603.     public void displayMaze () {
  604.         int k, l;
  605.        
  606.         System .out .println ();
  607.         for (k = 0; mazeHeight > k; ++k) {
  608.             for (l = 0; mazeWidth > l; ++l) {
  609.                 switch (mazeMap [k] [l]) {
  610.                 case MAZE_CELL_EMPTY:
  611.                     System .out .print ('.');
  612.                     break;
  613.                 case MAZE_CELL_WALL:
  614.                     System .out .print ('#');
  615.                     break;
  616.                 default:
  617.                     System .out .print (' ');
  618.                     break;
  619.                 }
  620.             }
  621.             System .out .println ();
  622.         }
  623.     }
  624.    
  625.     public void displayMazeFlagged (boolean [] flags) {
  626.         int k, l;
  627.        
  628.         System .out .println ();
  629.         for (k = 0; mazeHeight > k; ++k) {
  630.             for (l = 0; mazeWidth > l; ++l) {
  631.                 switch (mazeMap [k] [l]) {
  632.                 case MAZE_CELL_EMPTY:
  633.                     if (flags [cellIndices [k] [l]]) {
  634.                         System .out .print (',');
  635.                     } else {
  636.                         System .out .print ('.');
  637.                     }
  638.                     break;
  639.                 case MAZE_CELL_WALL:
  640.                     System .out .print ('#');
  641.                     break;
  642.                 default:
  643.                     System .out .print (' ');
  644.                     break;
  645.                 }
  646.             }
  647.             System .out .println ();
  648.         }
  649.     }
  650.    
  651.     public void displayMazeWithActiveCells () {
  652.         int k, l;
  653.        
  654.         System .out .println ();
  655.         for (k = 0; mazeHeight > k; ++k) {
  656.             for (l = 0; mazeWidth > l; ++l) {
  657.                 switch (mazeMap [k] [l]) {
  658.                 case MAZE_CELL_EMPTY:
  659.                     if (activeCellsMap [k] [l]) {
  660.                         System .out .print (',');
  661.                     } else {
  662.                         System .out .print ('.');
  663.                     }
  664.                     break;
  665.                 case MAZE_CELL_WALL:
  666.                     System .out .print ('#');
  667.                     break;
  668.                 default:
  669.                     System .out .print (' ');
  670.                     break;
  671.                 }
  672.             }
  673.             System .out .println ();
  674.         }
  675.     }
  676.    
  677.     public void displayState (State state, boolean flag) {
  678.         int k, l;
  679.         char [] [] tempMap = new char [mazeHeight] [mazeWidth];
  680.         short [] stateCells = state .getStateCells ();
  681.        
  682.         for (k = 0; mazeHeight > k; ++k) {
  683.             for (l = 0; mazeWidth > l; ++l) {
  684.                 switch (mazeMap [k] [l]) {
  685.                 case MAZE_CELL_EMPTY:
  686.                     tempMap [k] [l] = '.';
  687.                     break;
  688.                 case MAZE_CELL_WALL:
  689.                     tempMap [k] [l] = '#';
  690.                     break;
  691.                 default:
  692.                     tempMap [k] [l] = ' ';
  693.                     break;
  694.                 }
  695.             }
  696.         }
  697.        
  698.         for (k = 0; stateCells .length > k; ++k) {
  699.             cellVectors .get (stateCells [k]) .setCell (tempMap, '$');
  700.         }
  701.         cellVectors .get (state .getPorterCell ()) .setCell (tempMap, '@');
  702.        
  703.         System .out .println ();
  704.         if (flag) {
  705.             System .out .println (String .format ("Moves: %d, pushes: %d", state .getMoveCount (), state .getPushCount ()));
  706.         }
  707.        
  708.         for (k = 0; mazeHeight > k; ++k) {
  709.             System .out .println (new String (tempMap [k]));
  710.         }
  711.     }
  712. }
  713.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement