交叉匹配 2D 阵列

cross match 2d array

提问人:mohammad mohammadi 提问时间:3/24/2022 更新时间:3/25/2022 访问量:218

问:

尝试实施更大规模的井字游戏

此游戏可以有 3 行以上的行和列

每当发现 4 个连续模式(水平、垂直或交叉)时

玩家是赢家

我已经找到了水平和垂直数学的实现

但找不到一种方法来识别 2D 数组中某个字符的交叉模式

请考虑以下二维数组

`

        char[][] char2d={
            {'*','o','o','*'},
            {'o','*','o','o'},
            {'o','o','*','o'},
            {'o','o','o','*'}
    }

`

如何检查“*”字符在此 2D 数组中是否有四个连续的十字图案

Java 数组 匹配

评论

0赞 Community 3/24/2022
请提供足够的代码,以便其他人可以更好地理解或重现问题。

答:

0赞 tucuxi 3/24/2022 #1

如果给定的起始位置是长度充满字符的向下对角线(如图所示,从左向右推进),则此函数返回。truesc

public static void isFullDownDiagonal(char[][] board, 
         int startCol, int startRow, int s, char c) {

   for (int i=0; i<s; i++) {
      if (board[startRow+i][startCol+i] != c) return false; 
                     //  \_ change this sign to test up diagonal         
   }
   return true;
}

只需稍作更改,即可测试向上的对角线。在棋盘中,左上角和下角的区域只能有对角线的起点。NxN(N-s+1)x(N-s+1)

0赞 Oboe 3/24/2022 #2

您可以使用来检查对角线是否只有:IntStream'*'

public static boolean checkDiagonals(char[][] arr) {
    int dimension = arr.length;
    return IntStream.range(0, dimension)
            .allMatch(i -> arr[i][i] == '*') 
    || IntStream.range(0, dimension)
            .allMatch(i -> arr[i][dimension - i - 1] == '*');
}
0赞 Idle_Mind 3/25/2022 #3

另一个...

  public static void main(String[] args) {       
    char[][] char2d={
      {'*','o','o','*'},
      {'o','*','o','o'},
      {'o','o','*','o'},
      {'o','o','o','*'}
    };
    System.out.println(hasCross(char2d, '*'));
  }

  public static boolean hasCross(char[][] board, char c) {
    // Assumes a SQUARE board!
    boolean crossA = true;
    boolean crossB = true;
    for(int col=0, rowA=0, rowB=(board.length-1); col<board.length; col++, rowA++, rowB--) {
      if (board[rowA][col]!=c) {
        crossA = false;
      }
      if (board[rowB][col]!=c) {
        crossB = false;
      }
    }
    return crossA || crossB;
  }