Java 如果构成路径的元素被包围,则使其无效

Java 如果构成路径的元素被包围,则使其无效,java,arraylist,2d,path-finding,Java,Arraylist,2d,Path Finding,我正在构建一个2D网格游戏,由单元格组成,玩家必须在其中放置代币并尝试包含(包围)对手的代币。现在每个单元格可以有3种状态:空、包含红色标记或包含蓝色标记 所有可以形成“路径”的单元都在一个列表中,我可以沿着该路径绘制经过单元中心的线(多边形)。 还有一个包含令牌的列表,其中一个被包围 现在我想找到一种方法来“失效”一个被包围的令牌,这样它就可以被路径计算忽略 见以下示例: 蓝色标记首先被包围,它们不能在任何进一步的路径计算中分离。 这是不允许的。先遏制,先赢。 以下所有代码均来自path类

我正在构建一个2D网格游戏,由单元格组成,玩家必须在其中放置代币并尝试包含(包围)对手的代币。现在每个单元格可以有3种状态:空、包含红色标记或包含蓝色标记

所有可以形成“路径”的单元都在一个列表中,我可以沿着该路径绘制经过单元中心的线(多边形)。 还有一个包含令牌的列表,其中一个被包围

现在我想找到一种方法来“失效”一个被包围的令牌,这样它就可以被路径计算忽略

见以下示例:

  • 蓝色标记首先被包围,它们不能在任何进一步的路径计算中分离。
  • 这是不允许的。先遏制,先赢。
  • 以下所有代码均来自path类:

    class Path extends Stack<int[]>{
    
        private Token[][] grid;
    
        //a path shorter than min can not surround any cell
        private static final int MIN_PATH_LEGTH = 3;
    
        //a collection of cells that has been tested
        private ArrayList<int[]>checked;
    
        //represents the cell where the search starts from
        int[] origin;
        //represents the token of the origin
        Token originToken;
    
        private int rows;
        private int cols;
    
        //represents the path bounds: min/max row/col in path
        private int minPathRow, maxPathRow, minPathCol, maxPathCol;
    
        Path(Token[][] grid){
    
            this.grid = grid;
            rows = grid.length;
            cols = grid[0].length;
        }
    
        //search for a path
        boolean findPath(int[] origin) {
    
            this.origin = origin;
    
            int row = origin[0] , col =  origin[1];
    
            //represents the token of the origin
            originToken = grid[row][col];
    
            //initialize list of checked items
            checked = new  CellsList();
    
            boolean found = findPath(row, col);
    
            if(found) {
                printPath();
            } else {
                System.out.println("No path found");
            }
    
            return found;
        }
    
        //recursive method to find path. a cell is represented by its row, col
        //returns true when path was found
        private boolean findPath(int row, int col) {
    
            //check if cell has the same token as origin
            if(grid[row][col] != originToken) {
                return false;
            }
    
            int[] cell = new int[] {row, col};
    
            //check if this cell was tested before to avoid checking again
            if(checked.contains(cell)) {
                return false;
            }
    
            //get cells neighbors
            CellsList neighbors = getNeighbors(row, col);
    
            //check if solution found. If path size > min and cell
            //neighbors contain the origin it means that path was found
            if((size() >= MIN_PATH_LEGTH) && neighbors.contains(origin)  ) {
    
                add(cell);
                return true;
            }
    
            //add cell to checked
            checked.add(cell);
    
            //add cell to path
            add(cell);
    
            //if path was not found check cell neighbors
            for(int[] neighbor : neighbors ) {
    
                boolean found = findPath(neighbor[0],neighbor[1]);
                if(found) {
                    return true;
                }
            }
    
            //path not found
            pop(); //remove last element from stack
            return false;
        }
    
    
        //use for testing
        private void printPath() {
    
            System.out.print("Path : " );
            for(int[] cell : this) {
                System.out.print(Arrays.toString(cell));
            }
            System.out.println("");
    
            List<int[]> containedCells = getContainedWithin();
    
            System.out.print(containedCells.size() +" cell contained : " );
            for(int[] cell : containedCells) {
                System.out.print(Arrays.toString(cell));
            }
            System.out.println("");
        }
    
        CellsList getPath() {
    
            CellsList cl = new CellsList();
            cl.addAll(this);
            return cl;
        }
    }
    
    类路径扩展堆栈{
    专用令牌[][]网格;
    //小于min的路径不能环绕任何单元格
    私有静态最终整数最小路径长度=3;
    //经过测试的细胞的集合
    私有数组列表检查;
    //表示搜索从何处开始的单元格
    int[]来源;
    //表示源的标记
    Token-originToken;
    私有int行;
    私人公司;
    //表示路径边界:路径中的最小/最大行/列
    私有int minPathRow、maxPathRow、minPathCol、maxPathCol;
    路径(令牌[][]网格){
    this.grid=grid;
    行=网格长度;
    cols=网格[0]。长度;
    }
    //搜索路径
    布尔findPath(int[]原点){
    this.origin=origin;
    int行=原点[0],列=原点[1];
    //表示源的标记
    originToken=网格[行][列];
    //初始化选中项目的列表
    选中=新单元格列表();
    布尔值find=findPath(行、列);
    如果(找到){
    printPath();
    }否则{
    System.out.println(“未找到路径”);
    }
    发现退货;
    }
    //查找路径的递归方法。单元格由其行col表示
    //找到路径时返回true
    私有布尔findPath(int行,int列){
    //检查单元格是否具有与原点相同的标记
    if(网格[行][列]!=originToken){
    返回false;
    }
    int[]单元格=新的int[]{row,col};
    //检查之前是否测试过此电池,以避免再次检查
    如果(选中。包含(单元格)){
    返回false;
    }
    //找邻居
    CellsList neights=getneights(行、列);
    //检查是否找到解决方案。如果路径大小>最小值和单元格
    //邻居包含原点,表示找到了路径
    if((size()>=MIN_PATH_LEGTH)&&neights.contains(origin)){
    添加(单元格);
    返回true;
    }
    //将单元格添加到选中的
    选中。添加(单元格);
    //将单元格添加到路径
    添加(单元格);
    //如果未找到路径,请检查单元格邻居
    for(int[]邻居:邻居){
    布尔值find=findPath(邻居[0],邻居[1]);
    如果(找到){
    返回true;
    }
    }
    //找不到路径
    pop();//从堆栈中删除最后一个元素
    返回false;
    }
    //用于测试
    私有void printPath(){
    系统输出打印(“路径:”);
    for(int[]单元格:此){
    System.out.print(Arrays.toString(cell));
    }
    System.out.println(“”);
    List containedCells=getContainedWithin();
    System.out.print(containedCells.size()+“包含单元格:”);
    for(int[]单元格:containedCells){
    System.out.print(Arrays.toString(cell));
    }
    System.out.println(“”);
    }
    CellsList getPath(){
    CellsList cl=新的CellsList();
    cl.addAll(本);
    返回cl;
    }
    }
    
    下面的代码查找单元格的邻居(path.java):

    //返回单元格行、列的所有邻居的列表
    专用小区列表GetNeights(整数行,整数列){
    CellsList邻居=新的CellsList();
    
    对于(int colNum=col-1;colNum此要求意味着以前的路径会影响当前路径的计算。
    可以通过多种方式实现。在当前程序结构中,最简单的方法是在所有路径中添加包含的单元格的静态集合。
    请参见
    allContainedWithin
    及其在代码中的使用方式。
    还请注意,我将
    getContainedWithin()
    重构为一个getter,并将其功能移动到一个新方法
    findContainedWithin()
    。 所有更改对其他类没有影响

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Stack;
    
    //a stack representing cells in the path
    //each cell represented by [row,col]
    class Path extends Stack<int[]>{
    
        private Token[][] grid;
    
        //a path shorter than min can not surround any cell
        private static final int MIN_PATH_LEGTH = 3;
    
        //a collection of cells that has been tested
        private ArrayList<int[]>checked;
    
        //represents the cell where the search starts from
        int[] origin;
        //represents the token of the origin
        Token originToken;
    
        private int rows;
        private int cols;
    
        //represents the path bounds: min/max row/col in path
        private int minPathRow, maxPathRow, minPathCol, maxPathCol;
    
        //a collection of all cells that are bounded by the path
        //and their token is of the opposite color of the path
        private List<int[]> containedWithin;
    
        //a STATIC collection that holds all containedWithin cells, of
        //current and previous paths
        private static CellsList allContainedWithin = new CellsList();
    
        Path(Token[][] grid){
    
            this.grid = grid;
            rows = grid.length;
            cols = grid[0].length;
        }
    
        //search for a path
        boolean findPath(int[] origin) {
    
            this.origin = origin;
    
            int row = origin[0] , col =  origin[1];
    
            //represents the token of the origin
            originToken = grid[row][col];
    
            //initialize list of checked items
            checked = new  CellsList();
    
            boolean found = findPath(row, col);
    
            if(found) {
    
                //find bounded cells
                findContainedWithin();
                //update the collection all
                allContainedWithin.addAll(containedWithin);
    
                printPath();
            } else {
                System.out.println("No path found");
            }
    
            return found;
        }
    
        //recursive method to find path. a cell is represented by its row, col
        //returns true when path was found
        private boolean findPath(int row, int col) {
    
            //check if cell has the same token as origin
            if(grid[row][col] != originToken) {
                return false;
            }
    
            int[] cell = new int[] {row, col};
    
            //check if this cell was tested before to avoid checking again
            if(checked.contains(cell)) {
                return false;
            }
    
            //check if this cell was contained in previously calculated paths
            if(allContainedWithin.contains(cell)) {
                return false;
            }
    
            //get cells neighbors
            CellsList neighbors = getNeighbors(row, col);
    
            //check if solution found. If path size > min and cell
            //neighbors contain the origin it means that path was found
            if((size() >= MIN_PATH_LEGTH) && neighbors.contains(origin)  ) {
    
                add(cell);
                return true;
            }
    
            //add cell to checked
            checked.add(cell);
    
            //add cell to path
            add(cell);
    
            //if path was not found check cell neighbors
            for(int[] neighbor : neighbors ) {
    
                boolean found = findPath(neighbor[0],neighbor[1]);
                if(found) {
                    return true;
                }
            }
    
            //path not found
            pop(); //remove last element from stack
            return false;
        }
    
        //return a list of all neighbors of cell row, col
        private CellsList getNeighbors(int  row, int col) {
    
            CellsList neighbors = new CellsList();
    
            for (int colNum = col - 1 ; colNum <= (col + 1) ; colNum +=1  ) {
    
                for (int rowNum = row - 1 ; rowNum <= (row + 1) ; rowNum +=1  ) {
    
                    if(!((colNum == col) && (rowNum == row))) {
    
                        if(isWithinGrid (rowNum, colNum )  ) {
    
                            neighbors.add( new int[] {rowNum, colNum});
                        }
                    }
                }
            }
    
            return neighbors;
        }
    
        private boolean isWithinGrid(int colNum, int rowNum) {
    
            if((colNum < 0) || (rowNum <0) ) {
                return false;
            }
            if((colNum >= cols) || (rowNum >= rows)) {
                return false;
            }
            return true;
        }
    
        //use for testing
        private void printPath() {
    
            System.out.print("Path : " );
            for(int[] cell : this) {
                System.out.print(Arrays.toString(cell));
            }
            System.out.println("");
    
            List<int[]> containedCells = getContainedWithin();
    
            System.out.print(containedCells.size()+" cell contained : " );
            for(int[] cell : containedCells) {
                System.out.print(Arrays.toString(cell));
            }
            System.out.println("");
        }
    
        CellsList getPath() {
    
            CellsList cl = new CellsList();
            cl.addAll(this);
            return cl;
        }
    
        //finds all cells that are bounded by the path
        //and their token is of the opposite color of the path
        private void findContainedWithin() {
    
            containedWithin = new ArrayList<>();
    
            //find path max and min X values, max and min Y values
            minPathRow = grid[0].length; //set min to the largest possible value
            maxPathCol = grid.length;
            maxPathRow = 0;              //set max to the largest possible value
            maxPathCol = 0;
    
            //find the actual min max x y values of the path
            for (int[] cell : this) {
                minPathRow = Math.min(minPathRow, cell[0]);
                minPathCol = Math.min(minPathCol, cell[1]);
                maxPathRow = Math.max(maxPathRow, cell[0]);
                maxPathCol = Math.max(maxPathCol, cell[1]);
            }
    
            //todo remove after testing
            System.out.println("x range: "+minPathRow + "-"
            + maxPathRow + " y range: " + minPathCol + "-" + maxPathCol);
    
            int[] cell = get(0);//get an arbitrary cell in the path
            Token pathToken = grid[cell[0]][cell[1]]; //keep a reference to its token
    
            //iterate over all cells within path x, y limits
            for (int col = minPathCol; col < (maxPathCol); col++) {
    
                for (int row = minPathRow; row < (maxPathRow); row++) {
    
                    //check cell color
                    Token token = grid[row][col];
                    if ((token == pathToken) || (token == Token.VIDE)) {
                        continue;
                    }
                    if (isWithinLoop(row,col)) {
                        containedWithin.add(new int[] {row, col});
                    }
                }
            }
        }
    
        //returns a collection of all cells that are bounded by the path
        //and their token is of the opposite color of the path
        List<int[]> getContainedWithin() {
    
            return containedWithin;
        }
    
        //check if row, col represent a cell with in path by checking if it has a
        //path-cell to its left, right, top and bottom
        private boolean isWithinLoop(int row, int col) {
    
            if(  isPathCellOnLeft(row, col)
                 &&
                 isPathCellOnRight(row, col)
                 &&
                 isPathCellOnTop(row, col)
                 &&
                 isPathCellOnBottom(row, col)
              ) {
                return true;
            }
    
            return false;
        }
    
        private boolean isPathCellOnLeft(int cellRow, int cellCol) {
    
            for ( int col = minPathCol; col < cellCol ; col++) {
    
                if(getPath().contains(new int[] {cellRow, col})) {
                    return true;
                }
            }
    
            return false;
        }
    
        private boolean isPathCellOnRight(int cellRow, int cellCol) {
    
            for ( int col = cellCol; col <= maxPathCol ; col++) {
    
                if(getPath().contains(new int[] {cellRow, col})) {
                    return true;
                }
            }
    
            return false;
        }
    
        private boolean isPathCellOnTop(int cellRow, int cellCol) {
    
            for ( int row =minPathRow; row < cellRow ; row++) {
    
                if(getPath().contains(new int[] {row, cellCol})) {
                    return true;
                }
            }
    
            return false;
        }
    
        private boolean isPathCellOnBottom(int cellRow, int cellCol) {
    
            for ( int row = cellRow; row <= maxPathRow; row++) {
    
                if(getPath().contains(new int[] {row, cellCol})) {
                    return true;
                }
            }
    
            return false;
        }
    }
    
    import java.util.ArrayList;
    导入java.util.array;
    导入java.util.List;
    导入java.util.Stack;
    //表示路径中的单元格的堆栈
    //每个单元格由[行,列]表示
    类路径扩展堆栈{
    专用令牌[][]网格;
    //小于min的路径不能环绕任何单元格
    私有静态最终整数最小路径长度=3;
    //经过测试的细胞的集合
    私有数组列表检查;
    //表示搜索从何处开始的单元格
    int[]来源;
    //表示源的标记
    Token-originToken;
    私有int行;
    私人公司;
    //表示路径边界:路径中的最小/最大行/列
    私有int minPathRow、maxPathRow、minPathCol、maxPathCol;
    //由路径限定的所有单元格的集合
    //他们的标记与路径的颜色相反
    包含在内的私有列表;
    //一个静态集合,包含单元格内的所有内容,例如
    //当前和以前的路径
    私有静态CellsList allContainedWithin=new CellsList();
    路径(令牌[][]网格){
    this.grid=grid;
    行=网格长度;
    cols=网格[0]。长度;
    }
    //搜索路径
    布尔findPath(int[]原点){
    this.origin=origin;
    int行=或
    
    List<int[]> getContainedWithin() {
    
            //find path max and min X values, max and min Y values
            minPathRow = grid[0].length; //set min to the largest possible value
            maxPathCol = grid.length;
            maxPathRow = 0;              //set max to the largest possible value
            maxPathCol = 0;
    
            //find the actual min max x y values of the path
            for (int[] cell : this) {
                minPathRow = Math.min(minPathRow, cell[0]);
                minPathCol = Math.min(minPathCol, cell[1]);
                maxPathRow = Math.max(maxPathRow, cell[0]);
                maxPathCol = Math.max(maxPathCol, cell[1]);
            }
    
            List<int[]> block = new ArrayList<>(25);
            int[] cell = get(0);//get an arbitrary cell in the path
            Token pathToken = grid[cell[0]][cell[1]]; //keep a reference to its token
    
            //iterate over all cells within path x, y limits
            for (int col = minPathCol; col < (maxPathCol); col++) {
    
                for (int row = minPathRow; row < (maxPathRow); row++) {
    
                    //check cell color
                    Token token = grid[row][col];
                    if ((token == pathToken) || (token == Token.VIDE)) {
                        continue;
                    }
                    if (isWithinLoop(row,col)) {
                        block.add(new int[] {row, col});
                    }
                }
            }
    
            return block;
        }
    
        //check if row, col represent a cell within path by checking if it has a 
        //path-cell to its left, right, top and bottom 
        private boolean isWithinLoop(int row, int col) {
    
            if(  isPathCellOnLeft(row, col)
                 &&
                 isPathCellOnRight(row, col)
                 &&
                 isPathCellOnTop(row, col)
                 &&
                 isPathCellOnBottom(row, col)
              ) {
                return true;
            }
    
            return false;
        }     
    }
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Stack;
    
    //a stack representing cells in the path
    //each cell represented by [row,col]
    class Path extends Stack<int[]>{
    
        private Token[][] grid;
    
        //a path shorter than min can not surround any cell
        private static final int MIN_PATH_LEGTH = 3;
    
        //a collection of cells that has been tested
        private ArrayList<int[]>checked;
    
        //represents the cell where the search starts from
        int[] origin;
        //represents the token of the origin
        Token originToken;
    
        private int rows;
        private int cols;
    
        //represents the path bounds: min/max row/col in path
        private int minPathRow, maxPathRow, minPathCol, maxPathCol;
    
        //a collection of all cells that are bounded by the path
        //and their token is of the opposite color of the path
        private List<int[]> containedWithin;
    
        //a STATIC collection that holds all containedWithin cells, of
        //current and previous paths
        private static CellsList allContainedWithin = new CellsList();
    
        Path(Token[][] grid){
    
            this.grid = grid;
            rows = grid.length;
            cols = grid[0].length;
        }
    
        //search for a path
        boolean findPath(int[] origin) {
    
            this.origin = origin;
    
            int row = origin[0] , col =  origin[1];
    
            //represents the token of the origin
            originToken = grid[row][col];
    
            //initialize list of checked items
            checked = new  CellsList();
    
            boolean found = findPath(row, col);
    
            if(found) {
    
                //find bounded cells
                findContainedWithin();
                //update the collection all
                allContainedWithin.addAll(containedWithin);
    
                printPath();
            } else {
                System.out.println("No path found");
            }
    
            return found;
        }
    
        //recursive method to find path. a cell is represented by its row, col
        //returns true when path was found
        private boolean findPath(int row, int col) {
    
            //check if cell has the same token as origin
            if(grid[row][col] != originToken) {
                return false;
            }
    
            int[] cell = new int[] {row, col};
    
            //check if this cell was tested before to avoid checking again
            if(checked.contains(cell)) {
                return false;
            }
    
            //check if this cell was contained in previously calculated paths
            if(allContainedWithin.contains(cell)) {
                return false;
            }
    
            //get cells neighbors
            CellsList neighbors = getNeighbors(row, col);
    
            //check if solution found. If path size > min and cell
            //neighbors contain the origin it means that path was found
            if((size() >= MIN_PATH_LEGTH) && neighbors.contains(origin)  ) {
    
                add(cell);
                return true;
            }
    
            //add cell to checked
            checked.add(cell);
    
            //add cell to path
            add(cell);
    
            //if path was not found check cell neighbors
            for(int[] neighbor : neighbors ) {
    
                boolean found = findPath(neighbor[0],neighbor[1]);
                if(found) {
                    return true;
                }
            }
    
            //path not found
            pop(); //remove last element from stack
            return false;
        }
    
        //return a list of all neighbors of cell row, col
        private CellsList getNeighbors(int  row, int col) {
    
            CellsList neighbors = new CellsList();
    
            for (int colNum = col - 1 ; colNum <= (col + 1) ; colNum +=1  ) {
    
                for (int rowNum = row - 1 ; rowNum <= (row + 1) ; rowNum +=1  ) {
    
                    if(!((colNum == col) && (rowNum == row))) {
    
                        if(isWithinGrid (rowNum, colNum )  ) {
    
                            neighbors.add( new int[] {rowNum, colNum});
                        }
                    }
                }
            }
    
            return neighbors;
        }
    
        private boolean isWithinGrid(int colNum, int rowNum) {
    
            if((colNum < 0) || (rowNum <0) ) {
                return false;
            }
            if((colNum >= cols) || (rowNum >= rows)) {
                return false;
            }
            return true;
        }
    
        //use for testing
        private void printPath() {
    
            System.out.print("Path : " );
            for(int[] cell : this) {
                System.out.print(Arrays.toString(cell));
            }
            System.out.println("");
    
            List<int[]> containedCells = getContainedWithin();
    
            System.out.print(containedCells.size()+" cell contained : " );
            for(int[] cell : containedCells) {
                System.out.print(Arrays.toString(cell));
            }
            System.out.println("");
        }
    
        CellsList getPath() {
    
            CellsList cl = new CellsList();
            cl.addAll(this);
            return cl;
        }
    
        //finds all cells that are bounded by the path
        //and their token is of the opposite color of the path
        private void findContainedWithin() {
    
            containedWithin = new ArrayList<>();
    
            //find path max and min X values, max and min Y values
            minPathRow = grid[0].length; //set min to the largest possible value
            maxPathCol = grid.length;
            maxPathRow = 0;              //set max to the largest possible value
            maxPathCol = 0;
    
            //find the actual min max x y values of the path
            for (int[] cell : this) {
                minPathRow = Math.min(minPathRow, cell[0]);
                minPathCol = Math.min(minPathCol, cell[1]);
                maxPathRow = Math.max(maxPathRow, cell[0]);
                maxPathCol = Math.max(maxPathCol, cell[1]);
            }
    
            //todo remove after testing
            System.out.println("x range: "+minPathRow + "-"
            + maxPathRow + " y range: " + minPathCol + "-" + maxPathCol);
    
            int[] cell = get(0);//get an arbitrary cell in the path
            Token pathToken = grid[cell[0]][cell[1]]; //keep a reference to its token
    
            //iterate over all cells within path x, y limits
            for (int col = minPathCol; col < (maxPathCol); col++) {
    
                for (int row = minPathRow; row < (maxPathRow); row++) {
    
                    //check cell color
                    Token token = grid[row][col];
                    if ((token == pathToken) || (token == Token.VIDE)) {
                        continue;
                    }
                    if (isWithinLoop(row,col)) {
                        containedWithin.add(new int[] {row, col});
                    }
                }
            }
        }
    
        //returns a collection of all cells that are bounded by the path
        //and their token is of the opposite color of the path
        List<int[]> getContainedWithin() {
    
            return containedWithin;
        }
    
        //check if row, col represent a cell with in path by checking if it has a
        //path-cell to its left, right, top and bottom
        private boolean isWithinLoop(int row, int col) {
    
            if(  isPathCellOnLeft(row, col)
                 &&
                 isPathCellOnRight(row, col)
                 &&
                 isPathCellOnTop(row, col)
                 &&
                 isPathCellOnBottom(row, col)
              ) {
                return true;
            }
    
            return false;
        }
    
        private boolean isPathCellOnLeft(int cellRow, int cellCol) {
    
            for ( int col = minPathCol; col < cellCol ; col++) {
    
                if(getPath().contains(new int[] {cellRow, col})) {
                    return true;
                }
            }
    
            return false;
        }
    
        private boolean isPathCellOnRight(int cellRow, int cellCol) {
    
            for ( int col = cellCol; col <= maxPathCol ; col++) {
    
                if(getPath().contains(new int[] {cellRow, col})) {
                    return true;
                }
            }
    
            return false;
        }
    
        private boolean isPathCellOnTop(int cellRow, int cellCol) {
    
            for ( int row =minPathRow; row < cellRow ; row++) {
    
                if(getPath().contains(new int[] {row, cellCol})) {
                    return true;
                }
            }
    
            return false;
        }
    
        private boolean isPathCellOnBottom(int cellRow, int cellCol) {
    
            for ( int row = cellRow; row <= maxPathRow; row++) {
    
                if(getPath().contains(new int[] {row, cellCol})) {
                    return true;
                }
            }
    
            return false;
        }
    }
    
    public class Cell {
    
        private int row, col;
        private Token token;
        private boolean isContained;
    
        Cell(int row, int col) {
    
            this(row, col, Token.VIDE);
        } 
    
        Cell(int row, int col, Token token) {
    
            this.row = Math.abs(row); //to allow only positve addresses
            this.col = Math.abs(col);
            this.token = (token == null) ? Token.VIDE : token;
        }
    
    
        int getRow() {
            return row;
        }
    
        int getCol() {
            return col;
        }
    
        Token getToken() {
            return token;
        }
    
        boolean isContained() {
            return isContained;
        }
    
        void setRow(int row) {
            this.row = row;
        }
    
        void setCol(int col) {
            this.col = col;
        }
    
        void setToken(Token token) {
            this.token = token;
        }
    
        void setContained(boolean isContained) {
            this.isContained = isContained;
        } 
    
        int[] getAddress() {
            return new int[] {row, col};
        }
    
        @Override
        public String toString() {
            return Arrays.toString(getAddress()) +"-"+ token;
        }
    
        @Override
        public boolean equals(Object cell) {
    
            if ((cell == null) || !(cell instanceof Cell)) {
                return false;
            }
    
            return Arrays.equals(getAddress(), ((Cell)cell).getAddress());
        }
    
        @Override
        public int hashCode() {
    
            return 31*row + 17*col;
        }
    }