<?php class lottery{ private $data; private $cur_key; private $dest_data; private $deep; function lottery($data) { $this->data = $data; } /** * * 返回前$deep 行的数据 * 负值为之前的行,正值为之后行。 * * @param int $deep */ function getRowByDeep($key ) { $dest_key = $key; if($dest_key >=0 && $dest_key < sizeof($this->data)) { return $this->data[$dest_key]; }else{ return false; } } /** * * * * @param 检测 $val 值是否满足指定深度,连续性的条件。 * @param 指定深度 $deep */ function checkInsequence($val,$deep = 1) { //很有意思的一个算法,从当前行(左上到右下,右上至左下) 减去deep 行 至当前行加上$deep 行,出现的连续值>=$deep 则为有效数据. $val = intval($val); $start = $this->cur_key -$deep+1; $end = $this->cur_key + $deep; $max1 = $this->getMaxSequence($val,$start,$end,$deep,-1); //得到左上至右下的最大连续值 $max2 = $this->getMaxSequence($val,$start,$end,$deep,1); //得到右上至左下的最大连续值 $max3 = $this->getMaxSequence($val,$start,$end,$deep,0); //得到竖直方向的最大值. $max4 = $this->getMaxInOneRow($val,$deep); $max = max($max1,$max2,$max3,$max4); return ($max>=$deep); } /** * ** 得到当前行的最大值 * * @param unknown_type $val * @param unknown_type $deep */ function getMaxInOneRow($val,$deep) { $temp = 0; $max = 0; $row = $this->getRowByDeep($this->cur_key); for($dest_val = $val-$deep+1;$dest_val < $val+$deep;$dest_val++) { if($this->isInArr($dest_val,$row)) { $temp ++; if($temp>$max) $max = $temp; }else { $temp =0; } } return $max; } /** * * * * @param 检测值 $val * @param 开始行数 $start * @param 结束行数 $end * @param 尝试 $deep //其实尝试就是 ($end - $start +1) /2 这里图方便 ,直接传递过来 * @param int $derection -1 为左上至右下, 1 为左下至右上。 */ function getMaxSequence($val,$start,$end,$deep,$derection) { $temp = 0; $max = 0; $t = $derection * $deep; for($i = $start;$i<$end;$i++) { $row = $this->getRowByDeep($i); $t = $t - $derection; $temp_val = $val +$t; if($this->isInArr($temp_val,$row)) { $temp ++; if($temp>$max) $max = $temp; }else { $temp =0; } } return $max; } //判断数组是否在其中 function isInArr($val_check,$arr) { if(!is_array($arr)) { return false; } foreach($arr as $key=>$val) { if(intval($val_check) == intval($val)) { //如果待验证的值和数组当前值相等,和符合条件 return true; } } return false; } /** * * * * @param 检测 $val 是否与相关尝试的值相同。 * @param unknown_type $deep */ function checkInRepeat($val,$deep = 1) { } /** * * * * @param 满足条件的层次 $deep */ function checkData($deep) { $this->deep = $deep; foreach ($this->data as $key=>$val) { $this->cur_key = $key; foreach ($val as $key_piece => $val_piece) { if($this->checkvalpiece($val_piece)) { $this->dest_data[$key][$key_piece] = "<font color =red>$val_piece </font>"; }else { $this->dest_data[$key][$key_piece] = "$val_piece"; } } } } /** * * 检则值是否满足条件。 * * @param unknown_type $val */ function checkvalpiece($val) { if($this->checkInsequence($val,$this->deep)) { return true; }else { return false; } } function showDest() { echo "<hr>"; echo "<h1>深度为$this->deep 的结果</h1>"; foreach ($this->dest_data as $key=>$val) { print_r($val); echo "<br/>"; } echo "<hr>"; } } $data[]=array("01" ,"02", "18" , "29" , "31" , "32"); $data[]=array("02" ,"09", "11" , "22" , "24" , "27"); $data[]=array("02" ,"16", "26" , "27" , "29" , "31"); $data[]=array("04", "05","06", "07", "08", "13"); $data[]=array("02", "04", "05", "08", "19", "22"); $data[]=array("03", "04", "15", "25", "26", "30"); $data[]=array("01", "03", "06", "12", "16", "32"); $data[]=array("01", "05", "14", "16", "17", "22"); $data[]=array("03", "06", "10", "16", "25", "31"); $data[]=array("05", "07", "13", "24", "25", "28"); $data[]=array("08", "18", "21", "28", "29", "33"); $data[]=array("08", "10", "11", "12", "25", "29"); $data[]=array("06", "11", "13", "22", "25", "32"); $data[]=array("09", "10", "11", "18", "19", "21"); $data[]=array("06", "13", "14", "28", "29", "30"); $data[]=array("03", "16", "19", "21", "24", "26"); $data[]=array("01", "06", "07", "11", "13", "16"); $data[]=array("08", "17", "21", "23", "25", "32"); $data[]=array("12", "19", "24", "25", "30", "32"); $data[]=array("03", "05", "13", "19", "25", "29"); $data[]=array("03", "06", "11", "20", "31", "32"); $data[]=array("04", "10", "19", "22", "28", "33"); $data[]=array("03", "09", "21", "23", "27", "31"); $data[]=array("02", "03", "04", "13", "20", "29"); $data[]=array("11", "12", "21", "23", "27", "32"); $data[]=array("03", "10", "13", "20", "21", "32"); $data[]=array("01", "06", "08", "10", "23", "33"); $data[]=array("01", "06", "10", "26", "27", "28"); $data[]=array("07", "21", "22", "26", "28", "30"); $data[]=array("04", "17", "23", "27", "28", "32"); $me = new lottery($data); $me->checkData(3); //检查满足3个数连组来的数据 $me->showDest(); $me->checkData(4); //检查满足3个数连组来的数据 $me->showDest(); ?>