查找是不是存在于 2D 中对角线、水平线或垂直线 - 一个接一个的值
Posted
技术标签:
【中文标题】查找是不是存在于 2D 中对角线、水平线或垂直线 - 一个接一个的值【英文标题】:Find if exists diagonally, horizontally, or vertically in 2D - values one after another查找是否存在于 2D 中对角线、水平线或垂直线 - 一个接一个的值 【发布时间】: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 个已经被识别),那么只需检查这一点即可更高效,因为您可以消除大部分搜索空间。 如果您愿意更改板的表示,您可以考虑使用位板以获得更快的性能:***.com/questions/7044670/…。 @emsworth 好的!在我开始做其他事情之前,我肯定会检查一下位板。为了简单起见,我想使用二维数组。还有其他可能更有效的数据结构吗? 【参考方案1】:int count=0;
boolean Check(int x,int y)
int p1;
int p2;
if(elementat[x+1][y+1]==1)
p1=1; p2=1;
else if(elementat[x+1][y]==1)
p1=1; p2=0;
else. if(elementat[x+1][y-1]==1)
p1=1; p2=-1;
else. if(elementat[x][y-1]==1)
p1=0;p2=-1;
else. if(elementat[x-1][y-1]==1)
p1=-1; p2=-1;
else. if(elementat[x-1][y]==1)
p1=-1; p2=0;
else. if(elementat[x-1][y+1]==1)
p1=-1; p2=1;
else. if(elementat[x][y+1]==1)
p1=0; p2=1;
Checknext(x,y);
Checknextinv(x,y);
If(count==5) // 5 means no. of elements to form line
return true
else
return false;
Checknext(x,y) //19 represents the 19x19 matrix
if((x+p1)<=19 && (x+p1)>=0 && (y+p2)<=19 && (y+p2)>=0)
if(element[x+p1][y+p2]==1)
count++;
checknext[x+p1][y+p2];
Checknextinv(x,y)
if( (x+(-1*p1))<=19 && (x+(-1*p1))>=0 && (y+(-1*p2))<=19 && (y+(-1*p2))>=0))
if(element[x+(-1*p1)][y+(-1*p2)]==1 )
count++;
checknextinv[x+(-1*p1)][y+(-1*p2)];
【讨论】:
以上是关于查找是不是存在于 2D 中对角线、水平线或垂直线 - 一个接一个的值的主要内容,如果未能解决你的问题,请参考以下文章