【发布时间】:2014-11-14 10:53:16
【问题描述】:
所以我正在制作一个 19 x 19 的棋盘游戏。它基本上是连接 5,称为五子棋。
我想制定一个有效的算法来查找是否连续有 'n' 件。数据存储为 19x19 的二维数组。但是为了问题的缘故,假设它是 6x6。
0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 1 0 0 0
0 0 0 1 0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 1
这些是连续 5 个 1 的两个示例。如何测试水平、垂直和对角线?
这是我效率低下的代码:
private boolean firstDiagonalCheck(int x, int y, int num) {
int count = 1;
int check = 0;
boolean rflag = true;
boolean lflag = true;
int pos = 1;
check = turnHuman + 1;
while (rflag) {
if (x + pos >= 19 || y + pos >= 19) {
rflag = false;
break;
}
if (gb.getBoard()[x + pos][y + pos] == check) {
count++;
pos++;
} else {
rflag = false;
}
}
pos = 1;
while (lflag) {
if (x - pos < 0 || y - pos < 0) {
lflag = false;
break;
}
if (gb.getBoard()[x - pos][y - pos] == check) {
count++;
pos++;
} else {
lflag = false;
}
}
if (count == num) {
return true;
}
return false;
}
这只是第一个对角线的一种方法。还有 3 个。
如何提高效率并检查所有 4 个方向?
编辑##################
我的代码的作用是: - 获取棋子的位置 (x,y) - 检查两边(如果垂直,则上下)并计算一排有多少 - 如果计数匹配所需的数量,("num"),则返回 true,否则返回 false。
如果我每次都检查整个棋盘以查看是否有连续的棋子会更有效吗?
【问题讨论】:
-
你想同时检查 4 个条件吗?
-
嗯,它应该检查所有 4 个条件。一次检查一个没关系,但一定有更好的方法!
-
如果您最终要检查整个电路板,那么只扫描每一行、每一列和对角线会更有效。但是,如果您只想查看最近的一块是否连续创建了 5 个(并且您可以假设如果板上其他地方的连续 5 个已经被识别),那么只需检查这一点即可更高效,因为您可以消除大部分搜索空间。
-
如果您愿意更改板的表示,您可以考虑使用位板以获得更快的性能:stackoverflow.com/questions/7044670/…。
-
@emsworth 好的!在我开始做其他事情之前,我肯定会检查一下位板。为了简单起见,我想使用二维数组。还有其他可能更有效的数据结构吗?