C++大學教程第七版8.16走迷宮問題

走迷宮
題目如上圖所示,我的代碼如下:


```cpp
/*
	走迷宮:
		#表示牆,.代表路
		思路:右手始終個跟着牆的方向 
*/ 

#include <iostream>

using namespace std;

//迷宮
//#: 代表牆   .: 代表路徑    X: 代表小老鼠 
char ch[12][13]=
{
	{'#','#','#','#','#','#','#','#','#','#','#','#','\0'},
	{'#','.','.','.','#','#','.','.','.','.','.','#','\0'},
	{'.','.','#','.','#','#','.','#','#','#','.','#','\0'},
	{'#','#','#','.','#','#','.','.','.','#','.','#','\0'},
	{'#','.','.','.','.','#','#','#','.','#','.','.','\0'},	
	{'#','#','#','#','.','#','.','#','.','#','.','#','\0'},
	{'#','.','.','#','.','#','.','#','.','#','.','#','\0'},
	{'#','#','.','#','.','#','.','#','.','#','.','#','\0'},
	{'#','.','.','.','.','.','.','.','.','#','.','#','\0'},
	{'#','#','#','#','#','#','.','#','#','#','.','#','\0'},
	{'#','.','.','.','.','.','.','#','.','.','.','#','\0'},
	{'#','#','#','#','#','#','#','#','#','#','#','#','\0'}
}; 

//顯示迷宮與小老鼠位置函數
void disp(int m,int n){
	cout << endl;
	for(int i=0;i<12;i++){
		for(int j=0;j<12;j++){
			if(i==m&&j==n){
				cout << "X" << " ";
			}else{
				cout << ch[i][j] << " ";
			}
		}
		cout << endl;
	}
}

/*--------探索迷宮函數
	d : 前進方向---->(0:上   1:下  2: 左  3:右) 
	first: 是否是初始地點,用於判斷是否到達邊界
	m , n ---->小老鼠的位置 
*/
void mazeTraverse(int d,int first=0,int m=2,int n=0){
	//每次顯示迷宮與小老鼠的位置
	disp(m,n);
	//若不是初始探尋,則判斷是否到達迷宮邊界
	if(!first&&(m==0||m==11||n==0||n==11))
			return;
	
	//可以向前走,且右手有牆,方向不變 
	// 可以向前走,但右手沒牆,此時向前走,方向向右轉 
	//否則不走,左轉 
	switch(d){
		case 0:	//向上
			if(ch[m-1][n]=='.'&&ch[m-1][n+1]=='#')   //可以向上直走
			{
				mazeTraverse(d,0,m-1,n);
				return; 
			} 
			//可以向上走,但向上之後右手沒牆 
			else if(ch[m-1][n]=='.'&&ch[m-1][n+1]!='#'){			
				mazeTraverse(3,0,m-1,n);
				return;
			}
			// 否則不走,向左轉 
			else										
				mazeTraverse(2,0,m,n);
			break; 
		case 1: //方向向下
			//可以向下直走
			if(ch[m+1][n]=='.'&&ch[m+1][n-1]=='#')   
			{
				mazeTraverse(d,0,m+1,n);
				return; 
			}
			//可以向下走但右手沒牆,向右轉
			else if(ch[m+1][n]=='.'&&ch[m+1][n-1]!='#'){	
				mazeTraverse(2,0,m+1,n);
				return;
			}
			// 否則不走,向左轉 
			else											
				mazeTraverse(3,0,m,n);
			break;	
		case 2: //向左
			//可以向左直走
			if(ch[m][n-1]=='.'&&ch[m-1][n-1]=='#')   
			{
				mazeTraverse(d,0,m,n-1);
				return; 
			}
			//可以向左走但右手沒牆,向右轉 
			else if(ch[m][n-1]=='.'&&ch[m-1][n-1]!='#'){	
				mazeTraverse(0,0,m,n-1);
				return;
			}
			// 否則不走,向左轉 
			else											
				mazeTraverse(1,0,m,n);
			break;
		case 3: //向右
			//可以向右直走
			if(ch[m][n+1]=='.'&&ch[m+1][n+1]=='#')   
			{
				mazeTraverse(d,0,m,n+1);
				return; 
			}
			//可以向右走但右手沒牆,向右轉
			else if(ch[m][n+1]=='.'&&ch[m+1][n+1]!='#'){	
				mazeTraverse(1,0,m,n+1);
				return;
			}
			// 否則不走,向左轉 
			else												
				mazeTraverse(0,0,m,n);
			break;
	} 
} 
int main(){
	mazeTraverse(3,1); 
	return 0;
}

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