題目如上圖所示,我的代碼如下:
```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;
}