编写汉诺塔程序并将移动步骤打印到程序里

编写汉诺塔程序并将移动步骤打印到程序里


编写汉诺塔程序,把移动步骤打印到程序里。

初始化:汉诺塔有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;
?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值