编写汉诺塔程序并将移动步骤打印到程序里
编写汉诺塔程序,把移动步骤打印到程序里。
初始化:汉诺塔有3个柱子,A柱子从上往下10个盘子,从上到下编号1~10号盘子,越上面的盘子越小。B和C柱子是空的。
移动过程:每次移动可移动一个盘子到其它柱子上,要保证任何时候,小盘子在大盘子上面。
目的:把所有盘子从A盘子移到B盘子。
编程:用递归,把所有移动路径记录下来,记录按以下格式,把除//注释部分外的内容存入txt文件。
A[1,2,3,4,5,6,7,8,9,10] B[] C[] //初始状态
Step1: 1 A -> B //把 1号盘从A移到B
A[2,3,4,5,6,7,8,9,10] B[1] C[] //step 1 完成后的状态
Step2: 2 A -> C //把2好盘从A移到C
A[3,4,5,6,7,8,9,10] B[1] C[2] //step 2 完成后的状态
…
A[] B[1,2,3,4,5,6,7,8,9,10] C[] //最终状态
一开始没有想到用栈,写的比较粗糙,代码如下:
<?php
function insert(&$arr,$n)
{
$arr[] = $n;
sort($arr);
return $arr;
}
function del(&$arr,$n)
{
if (!is_array($arr)) {
echo "no";
return $arr;
}
foreach($arr as $k=>$v) {
/**
* foreach遍历,删除数组中指定值的元素
*/
if ($v == $n) {
unset($arr[$k]);
}
}
return $arr;
}
function choose_1($a,$b,&$A,&$B,&$C,$n)
{
global $A;
global $B;
global $C;
switch ($a)
{
case 'A':
del($A,$n);
return $A;
break;
case 'B':
del($B,$n);
return $B;
break;
case 'C':
del($C,$n);
return $C;
break;
default:
break;
}
}
function choose_2($a,$b,&$A,&$B,&$C,$n)
{
global $A;
global $B;
global $C;
switch($b)
{
case 'A':
insert($A,$n);
return $A;
break;
case 'B':
insert($B,$n);
return $B;
break;
case 'C':
insert($C,$n);
return $C;
break;
default:
break;
}
}
//将所有圆盘从a移到b
function hanuota($n,$a,$b,$c){
$file = "1.txt";
$fp = fopen($file, 'a');
global $step;
global $A;
global $C;
global $B;
if($n==1){
$step++;
choose_1($a,$b,$A,$B,$C,$n);
choose_2($a,$b,$A,$B,$C,$n);
$str_1=implode(' ',$A);
$str_2=implode(' ',$B);
$str_3=implode(' ',$C);
$content_1= "Step $step : $a -> $b \n A :[ $str_1 ] \n B :[ $str_2 ]\n C :[ $str_3 ]\n";//把 $n 号盘从 $a 移到 $b
echo $content_1;
fwrite($fp, $content_1);
}
else{
hanuota($n-1,$a,$c,$b);
$step++;
choose_1($a,$b,$A,$B,$C,$n);
choose_2($a,$b,$A,$B,$C,$n);
$str_1=implode(' ',$A);
$str_2=implode(' ',$B);
$str_3=implode(' ',$C);
$content_2= "Step $step : $a -> $b \n A :[ $str_1 ] \n B :[ $str_2 ]\n C :[ $str_3 ]\n";//把 $n 号盘从 $a 移到 $b
echo $content_2;
fwrite($fp, $content_2);
hanuota($n-1,$c,$b,$a);
}
fclose($fp);
}
//移动的次数
$step = 0;
$num = 10;
$A=range(1,$num);
$B=array();
$C=array();
hanuota($num, 'A', 'B', 'C');
echo "移动次数:" . $step;
?>