使用栈解决迷宫问题(不是最优路径)php

<?php
	/*
	*迷宫数组
	*1表示墙
	*0表示路
	*/
	$arr = array(
		array(1,1,1,1,1,1,1,1,1,1),
		array(1,0,0,1,0,0,0,1,0,1),
		array(1,0,0,1,0,0,0,1,0,1),
		array(1,0,0,0,0,1,1,0,0,1),
		array(1,0,1,1,1,0,0,0,0,1),
		array(1,0,0,0,1,0,0,0,0,1),
		array(1,0,1,0,0,0,1,0,0,1),
		array(1,0,1,0,0,0,1,1,0,1),
		array(1,1,0,0,0,0,0,0,0,1),
		array(1,1,1,1,1,1,1,1,1,1),
	);		
	
	//调用函数
	mgpath(1,1,8,8);
	
	/*
	*迷宫算法函数
	*使用堆栈思想,其实就是回溯法
	*/
	function mgpath($x1,$y1,$x2,$y2){
		/*
		*每一步对象
		*/
		class block{
			//横坐标
			public $i;
			//纵坐标
			public $j;
			//下一个可走方块的方位号
			public $di;	
		}
		$st = array();
		global $arr;
		//初始化栈顶		
		$top = -1;
		/*
		*设置起点坐标
		*/
		$top++;		
		$st[$top] = new block;
		$st[$top]->i = $x1;
		$st[$top]->j = $y1;	
		$st[$top]->di = -1;
		$arr[$x1][$y1] = -1;
		
		/*
		*回溯堆栈
		*栈不为空时循环
		*/
		while($top > -1){
			$i = $st[$top]->i;	
			$j = $st[$top]->j;	
			$di = $st[$top]->di;	
			
			/*
			*找到出口,输出路径
			*/
			if($i == $x2 && $j = $y2){
				print('迷宫路径如下:<br>');	
				for($k = 0; $k <= $top; $k++){
					printf("(%d,%d)",$st[$k]->i,$st[$k]->j);	
					if(($k+1)%5==0) print("<br>");//每输出5个方块后换一行
				}
				return;//找到一条路径后结束
			}
			
			$find = 0;
			while($di < 4 && $find==0){				
				$di++;
				switch($di){
					case 0:$i = $st[$top]->i - 1; $j = $st[$top]->j; break;
					case 1:$i = $st[$top]->i; $j = $st[$top]->j + 1; break;
					case 2:$i = $st[$top]->i + 1; $j = $st[$top]->j; break;
					case 3:$i = $st[$top]->i; $j = $st[$top]->j - 1; break;
				}
								
				if($arr[$i][$j] == 0) $find = 1;				
			}
			
			if($find == 1){ //找到下一个可走的方块
				$st[$top]->di = $di; //修改栈顶元素的di值
				$top++;		//下一个可走方块进栈			
				$st[$top] = new block;
				$st[$top]->i = $i;
				$st[$top]->j = $j;
				$st[$top]->di = -1;
				$arr[$i][$j] = -1;	//避免重复走到该方块		
			}else{
					$arr[$st[$top]->i][$st[$top]->j] = 0; //没有路径可走,则退栈
					$top--;	
				}				
			}			
			print("没有路径可走");
	}
	
?>

    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/crazy__chen/article/details/23304487
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞