查找是不是存在于 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 中对角线、水平线或垂直线 - 一个接一个的值的主要内容,如果未能解决你的问题,请参考以下文章

X - The Game POJ - 1970

关于元素水平垂直居中的那些事?

iOS - 检查[CGPoint]直线

UIScrollview在垂直和水平ios中滚动

识别触摸移动方向

如何在love2D中垂直和水平居中对齐文本?