#include<iostream>
#include<string>
#include<stack>
using namespace std;
#define n 8stack <int *> s;int * createMaze(){//初始化迷宮int i,j;int * a;a=new int[n*n];for(i=0;i<n;i++){for(j=0;j<n;j++){*(a+n*i+j)=-1;//不設置為0的原因是超過矩陣范圍的位置} //系統默認的是0,會引起麻煩}*(a+n*0+1)=3;s.push(a+n*0+1);//當前位置入棧*(a+n*1+1)=1;*(a+n*1+2)=1;*(a+n*1+3)=1;*(a+n*1+5)=1;*(a+n*2+3)=1;*(a+n*2+4)=1;*(a+n*2+5)=1;*(a+n*2+6)=1;*(a+n*3+1)=1;*(a+n*3+2)=1;*(a+n*3+3)=1;*(a+n*3+5)=1;*(a+n*4+1)=1;*(a+n*4+4)=1;*(a+n*5+1)=1;*(a+n*5+2)=1;*(a+n*5+4)=1;*(a+n*5+5)=1;*(a+n*5+6)=1;*(a+n*6+2)=1;*(a+n*6+3)=1;*(a+n*6+4)=1;*(a+n*6+6)=1;*(a+n*7+6)=1;return a;
}
//程序中標記-1,1,2,3,4的值表示意義例如以下:
//-1:障礙物(方塊)
//1:可行走的通道且還未曾被五角星通過
//2:五角星走過的通道(這樣說不全然準確)。更準確的說是已經壓棧的元素(地址)
//3:標識五角星
//4:遇到再也走不通的位置,離開時所填充的障礙(與-1的作用同樣,可是不顯示出來)void printMaze(int * a){//打印迷宮int i,j;for(i=0;i<n;i++){for(j=0;j<n;j++){if(*(a+n*i+j)==1||*(a+n*i+j)==2||*(a+n*i+j)==4){cout<<" ";}else if(*(a+n*i+j)==3){cout<<"★";}else{//*(a+n*i+j)==-1cout<<"■";}}cout<<endl;}
}void run(int * a,char ch){int i,j;for(i=0;i<n;i++){for(j=0;j<n;j++){if(*(a+n*i+j)==3){switch(ch){case 'w':if(*(a+n*(i-1)+j)==1){*(s.top())=2;s.push(a+n*(i-1)+j);//入棧*(s.top())=3;}if(*(a+n*(i-1)+j)==2){*(s.top())=-1;s.pop();//出棧*(s.top())=3;}return;case 'a':if(*(a+n*i+j-1)==1){*(s.top())=2;s.push(a+n*i+j-1);//入棧*(s.top())=3;}if(*(a+n*i+j-1)==2){*(s.top())=-1;s.pop();//出棧*(s.top())=3;}return;case 's':if(*(a+n*(i+1)+j)==1){*(s.top())=2;s.push(a+n*(i+1)+j);//入棧*(s.top())=3;}if(*(a+n*(i+1)+j)==2){*(s.top())=-1;s.pop();//出棧*(s.top())=3;}return;case 'd':if(*(a+n*i+j+1)==1){*(s.top())=2;s.push(a+n*i+j+1);//入棧*(s.top())=3;}if(*(a+n*i+j+1)==2){*(s.top())=-1;s.pop();//出棧*(s.top())=3;}return;}}}}
}char getDirection(int * a){//得到方向int i,j;for(i=0;i<n;i++){for(j=0;j<n;j++){if(*(a+n*i+j)==3){//必須按優先級排列if(*(a+n*i+j+1)==1){return 'd';}if(*(a+n*(i+1)+j)==1){return 's';}if(*(a+n*i+j-1)==1){return 'a';}if(*(a+n*(i-1)+j)==1){return 'w';}if(*(a+n*i+j+1)==2){return 'd';}if(*(a+n*(i+1)+j)==2){return 's';}if(*(a+n*i+j-1)==2){return 'a';}if(*(a+n*(i-1)+j)==2){return 'w';}else{cout<<"無效按鍵"<<endl;}}}}
}int handle(){int * a;int count=1;string step;//用string是為了避免用戶多輸入字符而引起錯誤a=createMaze();printMaze(a);cout<<"請按隨意鍵進行下一步!"<<endl;while(*(a+n*7+6)!=3){cout<<"第"<<count<<"步:";cin>>step;run(a,getDirection(a));printMaze(a);count++;}cout<<"恭喜你,順利到達終點!"<<endl;return 0;
}int main(){handle();return 0;
}
版權聲明:本文博主原創文章,博客,未經同意不得轉載。