查找是否在2D中对角线,水平或垂直存在 - 一个接一个地显示值

时间:2014-09-19 19:05:53

标签: java arrays 2d

所以我做了一个19岁到19岁的桌面游戏。它基本上是连接5,叫做Gomoku。

我想制作一个有效的算法来查找是否有' n'连续的碎片。数据存储为19x19的2D数组。但是出于问题的原因,让我们说它是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个。我如何测试HORIZONTAL,VERTICAL和DIAGONALS?

这是我效率低下的代码:

 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;
}

这只是第一个Diagonal的一种方法。还有3个。

如何提高效率并检查所有4个方向?

编辑##################

我的代码的作用是: - 获取作品的位置(x,y) - 检查两侧(如果垂直,则上下)并计算连续两侧的数量 - 如果所需的计数匹配,(&#34; num&#34;),则返回true,否则返回false。

如果每次检查WHOLE板是否连续有碎片,那么效率会更高吗?

1 个答案:

答案 0 :(得分:0)

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)];
        }
 }