【问题标题】:Finding 5 values in a row diagonally in Java在Java中对角线连续查找5个值
【发布时间】:2013-12-04 20:16:45
【问题描述】:

我有这个 10x10 数组:

private static int[][] intersections = new int[10][10];

我正在使用此代码来查找水平方向是否有 5 个值:

public static int horizontalCheck() {
    String horizontal = "";
    for (int i = 0; i < intersections.length; i++) {
        for (int j = 0; j < intersections[i].length; j++) {
            horizontal += Integer.toString(intersections[i][j]);
        }
        if (horizontal.indexOf("11111") != -1) {
            // White wins.
            return 1;
        } else if (horizontal.indexOf("22222") != -1) {
            // Black wins.
            return 2;
        }
        horizontal = "";
    }
    return 0;
}

还有一个类似的代码可以垂直执行。但我的问题是,我怎样才能找到对角线是否有 5 个值?棋盘大小为 10x10,对角线可以在棋盘上的任何位置进行双向。如果您有任何问题或需要有关代码的更多信息,请务必提出。

【问题讨论】:

  • 这是什么意思?水平方向连续 5 个值。
  • 我认为使用 horizontal.contains 会更习惯。
  • @Trojan.ZBOT 基本上我的意思是,它是一个五子棋游戏,你可以在水平、垂直或对角线连续拥有 5 个按钮的情况下获胜。播放器按钮在数组中相应地表示为 1 和 2。
  • 小点。不管交叉的奇怪算法,如果它运行多次,你不应该使用字符串连接。这是致命的无效。请改用StringBuilder

标签: java


【解决方案1】:

我建议你为此编写一个辅助函数。该函数应采用以下参数:

  • r0 - 需要开始检查的起始行
  • c0 - 检查需要从哪个起始列开始
  • dr - 来自{-1, 0, 1} 的垂直步长
  • dc - 来自{-1, 0, 1} 的水平步长
  • len - 要找到的项目数
  • num - 要查找的号码。

这是这个函数的外观:

private static boolean checkRow(int r0, int c0, int dr, int dc, int len, int num) {
    for (int k = 0 ; k != len ; k++) {
        int r = r0 + k*dr;
        int c = c0 + k*dc;
        if (r < 0 || c < 0 || r >= intersections.length || c > intersections[r].length || intersections[r][c] != num) {
            return false;
        }
    }
    return true;
}

有了这个功能,你可以在任何你希望的方向连续检查len项目:

// See if we've got five eights in any direction:
for (int r = 0 ; r != intersections.length ; r++) {
    for (int c = 0 ; c != intersections[r].length ; c++) {
        if (checkRow(r, c, 0, 1, 5, 8)) {
            System.out.println("Horizontal, starting at "+r+" " +c);
        }
        if (checkRow(r, c, 1, 0, 5, 8)) {
            System.out.println("Vertical, starting at "+r+" " +c);
        }
        if (checkRow(r, c, 1, 1, 5, 8)) {
            System.out.println("Diagonal descending right, starting at "+r+" " +c);
        }
        if (checkRow(r, c, 1, -1, 5, 8)) {
            System.out.println("Diagonal descending left, starting at "+r+" " +c);
        }
    }
}

【讨论】:

  • 感谢您的帮助。
猜你喜欢
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多