03.1迷宮

遞歸(recursion)

  • 基本介紹

    程序調用自身的編程技巧稱為遞歸。遞歸算法相對於常用的算法如普通算法等,運行效率較低。在遞歸調用的過程中系統為每一層的返回點、局部量等開闢了棧儲存。遞歸次數過多容易造成棧溢出。

  • 應用場景

    • 8皇后問題
    • 漢諾塔
    • 階乘
    • 迷宮
    • 球和籃子
    • 用棧解決的一些問題
  • 注意:函數的局部變量是獨立的,不會相互影響,如果希望各個函數棧使用同一個數據,使用引用傳遞。

  • 代碼實例

    //迷宮問題
    //如果二維數組中的元素為1,就是墻
    //0即沒有走過,2是通路,3是走過的點(不通)
    //最短路徑待完成
    func SetWay(myMap *[8][7]int,i,j int) bool {
    	//[6][5]下標對應第七行第6列,定義為出口
    	if myMap[6][5] == 2 {
    		return true
    	}else {
    		//如果沒有走過
    		if myMap[i][j] == 0 {
    			//將其設置為能夠走的通路
    			myMap[i][j] = 2
    			if SetWay(myMap,i+1,j){//下
    				return true
    			}else if SetWay(myMap,i,j+1){//右
    				return true
    			}else if SetWay(myMap,i-1,j){//左
    				return true
    			}else if SetWay(myMap,j,j-1){//上
    				return true
    			}else {
    				//如果走回來了,說明只有一條死路
    				myMap[i][j] = 3
    				return false
    			}
    		}else {//數值是1,為墻
    			return false
    		}
    	}
    }
    func main() {
    	//迷宮大小
    	var myMap[8][7]int
    	//上下左右四周是墻
    	for i:=0;i<7;i++{
    		myMap[0][i] = 1
    		myMap[7][i] = 1
    	}
    	for i := 0; i < 8; i++ {
    		myMap[i][0] = 1
    		myMap[i][6] = 1
    	}
    	//設置的額外的墻
    	myMap[3][1] = 1
    	myMap[3][2] = 1
    	//迷宮地圖
    	for i := 0;i<8;i++ {
    		for j := 0; j < 7; j++ {
    			fmt.Print(myMap[i][j],"")
    		}
    		fmt.Println()
    	}
    	//開始遞歸搜索
    	SetWay(&myMap,1,1)
    	fmt.Println("探測完畢")
    	for i := 0; i < 8; i++ {
    		for j := 0; j < 7; j++ {
    			fmt.Print(myMap[i][j],"")
    		}
    		fmt.Println()
    	}
    }
    
鏈接

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值