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()
    	}
    }
    
鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章