如何判断连接和交叉递减或递增出现的数字?

时间:2022-11-04 21:58:02
图1
如何判断连接和交叉递减或递增出现的数字?
图2
如何判断连接和交叉递减或递增出现的数字?

如图一、图二所示
问题一:如黄线所示,如何判断一个数连续出现并且出现次数大于或等于3次.
问题二:如红线所示,如何判断一个数交叉递减或递增并且出现次数大于或等于3次.

5 个解决方案

#1




如果先保存到2维数组里,横坐标为x,纵坐标为y
那么连续出现3次的是 $arr[y][x] == $arr[y+1][x] == $arr[y+2][x]
递增: $arr[y][x]==$arr[y+1][x+1]-1==$arr[y+2][x+2]-2   $arr[y][x]==$arr[y+1][x-1]-1==$arr[y+2][x-2]-2
递增: $arr[y][x]==$arr[y+1][x+1]+1==$arr[y+2][x+2]+2   $arr[y][x]==$arr[y+1][x-1]+1==$arr[y+2][x-2]+2

SQL麻烦点原理相同。

#2


老大来了啊。。呵呵。。
能不能写的详细点啊。。
最好能写个function出来,
方便以后调用。。。
谢谢了啊

#3


<?php
$data = array(
  array("508",0,1,1,1,1,5,1,1,8,1),
  array("416",1,1,2,2,4,1,6,2,1,2),
  array("389",2,1,3,3,1,2,1,3,8,9),
  array("645",3,2,4,1,4,5,6,4,1,1),
  array("698",4,3,5,2,1,1,6,5,8,9),
  array("567",5,4,6,3,2,5,6,7,1,1),
  array("652",6,5,2,4,3,5,6,1,2,2),
  array("658",7,6,1,5,4,5,6,2,8,3),
  array("208",0,7,2,6,5,1,1,3,8,4));

function find_bingo($arry, $min_continual_times=3)
{
  $rst = array();

  for ($row = 0; $row < count($arry) - $min_continual_times; $row++)
  {
    for ($col=1; $col < count($arry[$row]); $col++)
    {
      $current = $arry[$row][$col];
      settype($current,"string");
      if (strpos($arry[$row][0], $current)!==false) 
      {
        // 竖线
        if ($row==0 || ($row>0 && $arry[$row][$col]!=$arry[$row-1][$col] 
          && $arry[$row][$col]==$arry[$row+1][$col]
          && strpos($arry[$row+1][0],$arry[$row+1][$col]."")!==false
        ))
        {
          $count = 2; $row1 = $row + 1;
          $str = $arry[$row][$col].$arry[$row1][$col];
          while ($row1+1<count($arry) 
            && $arry[$row1][$col]==$arry[$row1+1][$col]
            && strpos($arry[$row1+1][0], $arry[$row1+1][$col]."")!==false
          ) 
          {
            $count++;
            $row1++;
            $str .= $arry[$row1][$col];
          }
          if ($count >= $min_continual_times) 
            $rst[] = array($row+1, $col, $arry[$row][$col], $str);
        }

        // 左对角线
        if (abs($arry[$row][$col]-$arry[$row-1][$col-1])!=1
          && abs($arry[$row][$col]-$arry[$row+1][$col+1])==1
          && strpos($arry[$row+1][0], $arry[$row+1][$col+1]."")!==false)
        {
          $count = 2; $row1 = $row + 1; $col1 = $col+1;
          $str = $arry[$row][$col].$arry[$row1][$col1];
          while ($arry[$row1][$col1]- $arry[$row1+1][$col1+1]==$arry[$row1-1][$col1-1]- $arry[$row1][$col1]
          && strpos($arry[$row1+1][0],$arry[$row1+1][$col1+1]."")!==false)
          {
            $count++; $row1++; $col1++;
            $str .= $arry[$row1][$col1];
          }
          if ($count >= $min_continual_times)
            $rst[] = array($row+1, $col, $arry[$row][$col], $str);
        }  
        
        // 右对角线
        if (abs($arry[$row][$col]-$arry[$row-1][$col+1] )!=1
          && strpos($arry[$row+1][0],$arry[$row+1][$col-1]."")!==false
          && abs($arry[$row][$col]-$arry[$row+1][$col-1])==1)
        {
          $count = 2; $row1 = $row + 1; $col1 = $col-1;
          $str = $arry[$row][$col].$arry[$row1][$col1];
          while ($arry[$row1][$col1]- $arry[$row1+1][$col1-1]==$arry[$row1-1][$col1+1]- $arry[$row1][$col1]
          && strpos($arry[$row1+1][0], $arry[$row1+1][$col1-1]."")!==false)
          {
            $count++; $row1++; $col1--;
            $str .= $arry[$row1][$col1];
          }
          if ($count >= $min_continual_times)
            $rst[] = array($row+1, $col, $arry[$row][$col], $str);
        }  
        
      }

    }
  }
  return $rst;
}

$bingos = find_bingo($data);
for ($i=0; $i<count($bingos); $i++)
{
  echo "[".$bingos[$i][0].",".$bingos[$i][1]."] ".$bingos[$i][2]." (".$bingos[$i][3].")\n";
}
?>


输出: [坐标] 第一个数字 (数字列)
[1,6] 5 (543)
[4,6] 5 (567)
[4,7] 6 (66666)
[5,9] 8 (8765)
[6,6] 5 (555)

中了别忘请客.

#4


ls费了不少心思和精力啊。

楼主想写彩票分析程序?

#5


感谢runffer_yang的帮助,在此谢谢了!!!

#1




如果先保存到2维数组里,横坐标为x,纵坐标为y
那么连续出现3次的是 $arr[y][x] == $arr[y+1][x] == $arr[y+2][x]
递增: $arr[y][x]==$arr[y+1][x+1]-1==$arr[y+2][x+2]-2   $arr[y][x]==$arr[y+1][x-1]-1==$arr[y+2][x-2]-2
递增: $arr[y][x]==$arr[y+1][x+1]+1==$arr[y+2][x+2]+2   $arr[y][x]==$arr[y+1][x-1]+1==$arr[y+2][x-2]+2

SQL麻烦点原理相同。

#2


老大来了啊。。呵呵。。
能不能写的详细点啊。。
最好能写个function出来,
方便以后调用。。。
谢谢了啊

#3


<?php
$data = array(
  array("508",0,1,1,1,1,5,1,1,8,1),
  array("416",1,1,2,2,4,1,6,2,1,2),
  array("389",2,1,3,3,1,2,1,3,8,9),
  array("645",3,2,4,1,4,5,6,4,1,1),
  array("698",4,3,5,2,1,1,6,5,8,9),
  array("567",5,4,6,3,2,5,6,7,1,1),
  array("652",6,5,2,4,3,5,6,1,2,2),
  array("658",7,6,1,5,4,5,6,2,8,3),
  array("208",0,7,2,6,5,1,1,3,8,4));

function find_bingo($arry, $min_continual_times=3)
{
  $rst = array();

  for ($row = 0; $row < count($arry) - $min_continual_times; $row++)
  {
    for ($col=1; $col < count($arry[$row]); $col++)
    {
      $current = $arry[$row][$col];
      settype($current,"string");
      if (strpos($arry[$row][0], $current)!==false) 
      {
        // 竖线
        if ($row==0 || ($row>0 && $arry[$row][$col]!=$arry[$row-1][$col] 
          && $arry[$row][$col]==$arry[$row+1][$col]
          && strpos($arry[$row+1][0],$arry[$row+1][$col]."")!==false
        ))
        {
          $count = 2; $row1 = $row + 1;
          $str = $arry[$row][$col].$arry[$row1][$col];
          while ($row1+1<count($arry) 
            && $arry[$row1][$col]==$arry[$row1+1][$col]
            && strpos($arry[$row1+1][0], $arry[$row1+1][$col]."")!==false
          ) 
          {
            $count++;
            $row1++;
            $str .= $arry[$row1][$col];
          }
          if ($count >= $min_continual_times) 
            $rst[] = array($row+1, $col, $arry[$row][$col], $str);
        }

        // 左对角线
        if (abs($arry[$row][$col]-$arry[$row-1][$col-1])!=1
          && abs($arry[$row][$col]-$arry[$row+1][$col+1])==1
          && strpos($arry[$row+1][0], $arry[$row+1][$col+1]."")!==false)
        {
          $count = 2; $row1 = $row + 1; $col1 = $col+1;
          $str = $arry[$row][$col].$arry[$row1][$col1];
          while ($arry[$row1][$col1]- $arry[$row1+1][$col1+1]==$arry[$row1-1][$col1-1]- $arry[$row1][$col1]
          && strpos($arry[$row1+1][0],$arry[$row1+1][$col1+1]."")!==false)
          {
            $count++; $row1++; $col1++;
            $str .= $arry[$row1][$col1];
          }
          if ($count >= $min_continual_times)
            $rst[] = array($row+1, $col, $arry[$row][$col], $str);
        }  
        
        // 右对角线
        if (abs($arry[$row][$col]-$arry[$row-1][$col+1] )!=1
          && strpos($arry[$row+1][0],$arry[$row+1][$col-1]."")!==false
          && abs($arry[$row][$col]-$arry[$row+1][$col-1])==1)
        {
          $count = 2; $row1 = $row + 1; $col1 = $col-1;
          $str = $arry[$row][$col].$arry[$row1][$col1];
          while ($arry[$row1][$col1]- $arry[$row1+1][$col1-1]==$arry[$row1-1][$col1+1]- $arry[$row1][$col1]
          && strpos($arry[$row1+1][0], $arry[$row1+1][$col1-1]."")!==false)
          {
            $count++; $row1++; $col1--;
            $str .= $arry[$row1][$col1];
          }
          if ($count >= $min_continual_times)
            $rst[] = array($row+1, $col, $arry[$row][$col], $str);
        }  
        
      }

    }
  }
  return $rst;
}

$bingos = find_bingo($data);
for ($i=0; $i<count($bingos); $i++)
{
  echo "[".$bingos[$i][0].",".$bingos[$i][1]."] ".$bingos[$i][2]." (".$bingos[$i][3].")\n";
}
?>


输出: [坐标] 第一个数字 (数字列)
[1,6] 5 (543)
[4,6] 5 (567)
[4,7] 6 (66666)
[5,9] 8 (8765)
[6,6] 5 (555)

中了别忘请客.

#4


ls费了不少心思和精力啊。

楼主想写彩票分析程序?

#5


感谢runffer_yang的帮助,在此谢谢了!!!