1. 程式人生 > >矩陣-天守閣

矩陣-天守閣

數組 算法 die 個數 brush func 方向 echo ext

<?php
header("content-type:text/html;charset=utf-8");
/**
面試題:寫一個函數有一個整數的參數【>=3】,根據這個整數輸出圖形:
n = 3;
3      4     5
10     11    6
9      8     7

思路:
1. 矩陣用一個二維數組:
$arr = array(
	array(3,0,0),
	array(0,0,0),
	array(0,0,0),
);
$arr[$x][$y]  -> $arr[0][0] -> $arr[0][1]
2. 移動的算法 
	向右移動 $y++
	右左移動 $y--
	向下移動 $x++
	向中移動 $x--
3. 向一個方向的移動條件,比如向右:a. 不能出框  b. 下一個格沒有被占【如果值是0代表沒有被占用】

 */

function jz($num)
{
	if($num < 3)
		die(‘must greater than 2 !‘);
	/***************** 拼出二維數組,初始值都是0 ***************************/
	for($i=0; $i<$num; $i++)
		for ($j=0; $j<$num; $j++)
			$arr[$i][$j] = 0;
	/*************** 初始化幾個變量 ******************************************/
	$direction = ‘r‘;   // 開始移動的方向 r[右] l[左] t[上] b[下]
	$maxNum = $num * $num + $num - 1; // 計算出最後一個數字
	$x = $y = 0;    // 放的格的坐標
	/******************************* 循環每個數字放到數組中相應位置上 ************/
	for ($i=$num; $i<=$maxNum; $i++)
	{
		if($arr[$x][$y] == 0)
			$arr[$x][$y] = $i;
		else 
		{
			if($direction == ‘r‘)
			{
				if(($y+1) < $num && $arr[$x][$y+1] == 0)
					$y++;
				else 
					$direction = ‘b‘;
			}
			if($direction == ‘b‘)
			{
				if(($x+1) < $num && $arr[$x+1][$y] == 0)
					$x++;
				else 
					$direction = ‘l‘;
			}
			if($direction == ‘l‘)
			{
				if(($y-1) >= 0 && $arr[$x][$y-1] == 0)
					$y--;
				else 
					$direction = ‘t‘;
			}
			if($direction == ‘t‘)
			{
				if(($x-1) >= 0 && $arr[$x-1][$y] == 0)
					$x--;
				else 
				{
					$direction = ‘r‘;
					if($direction == ‘r‘)
					{
						if(($y+1) < $num && $arr[$x][$y+1] == 0)
							$y++;
						else 
							$direction = ‘b‘;
					}
				}
			}
			$arr[$x][$y] = $i;
		}
	}
	/**************** 使用數組輸出圖形 ***************/
	$table = ‘<table border="1">‘;
	foreach ($arr as $v)
	{
		$table .= ‘<tr>‘;
			foreach ($v as $v1)
			{
				$table .= ‘<td>‘.$v1.‘</td>‘;
			}
		$table .= ‘</tr>‘;
	}
	$table .= ‘</table>‘;
	echo $table;
}

$num=!empty($_GET["num"])?$_GET["num"]:5;
jz($num);
?>

  

矩陣-天守閣