$num = 10;
$arr = foo($num);
$arr =array_reverse($arr);
for ($i = 0 ;$i< $num;$i++){spa
echo $arr[$i] .PHP_EOL; echo '<br>';
}
function foo($num){code
//填充map $data = new stdClass(); $data->x = 1; $data->y = 1; $data->num = $num; $data->len = $num * $num; $data->tmp_data = []; $data->rate = 1;//方向 $data->struct = create_struct($num); for ($i = $data->len;$i>=1;$i--){ $data->i = $i; $key = change_key($data); $data->tmp_data[$key] = $i; unset($data->struct[$key]); } //根據y座標分組 $data->struct = create_struct($num); foreach ($data->tmp_data as $key=> $value){ $data->struct[$key]= $value; } for ($i=1;$i<=$data->num;$i++){ $start = ($i - 1)*$data->num; $end = $data->num; $slice = array_slice($data->struct,$start,$end); $data->slice[] = '['.implode(",", $slice).']'; } return $data->slice;
}
function change_key($data){blog
//check key $key = $data->x.','.$data->y; if(isset($data->struct[$key])){ return $key; } switch ($data->rate) { case 1: //left $data->tmp_x = $data->x + 1; $key = $data->tmp_x.','.$data->y; if(isset($data->struct[$key])){ $data->x = $data->tmp_x; return $key; }else{ $data->rate=2; $data->y = $data->y+1; } break; case 2: //down $data->tmp_y = $data->y + 1; $key = $data->x.','.$data->tmp_y; if(isset($data->struct[$key])){ $data->y = $data->tmp_y; return $key; }else{ $data->rate=3; } break; case 3: //right $data->tmp_x = $data->x - 1; $key = $data->tmp_x.','.$data->y; if(isset($data->struct[$key])){ $data->x = $data->tmp_x; return $key; }else{ $data->rate=4; } break; case 4: //up $data->tmp_y = $data->y - 1; $key = $data->x.','.$data->tmp_y; if(isset($data->struct[$key])){ $data->y = $data->tmp_y; return $key; }else{ $data->rate=1; } break; } return change_key($data);
}
function create_struct($num){ip
$struct = []; for ($i=1;$i<=$num;$i++){ //嵌套 for($m=1;$m<=$num;$m++){ $key = $m . ','. $i; $struct[$key] = ''; } } return $struct;
}
function dump($data){it
echo '<pre>'; print_r($data); echo '</pre>'; echo '<br>';
}io
輸出結果function
[73,74,75,76,77,78,79,80,81,82]
[72,43,44,45,46,47,48,49,50,83]
[71,42,21,22,23,24,25,26,51,84]
[70,41,20,7,8,9,10,27,52,85]
[69,40,19,6,1,2,11,28,53,86]
[68,39,18,5,4,3,12,29,54,87]
[67,38,17,16,15,14,13,30,55,88]
[66,37,36,35,34,33,32,31,56,89]
[65,64,63,62,61,60,59,58,57,90]
[100,99,98,97,96,95,94,93,92,91]class