软件综合实习
//╞╪╪╪╪╪╪╪【定义栈数据结构】╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╡ class Stack { private:
LinkNode *top; //指向第一个结点的栈顶指针 public:
Stack(); //构造函数,置空栈 ~Stack(); //析构函数
void Push(T e); //把元素data压入栈中 T Pop(); //使栈顶元素出栈 T GetPop(); //取出栈顶元素 void Clear(); //把栈清空 bool empty(); //判断栈是否为空,空返回1,否则返回0 };
//╞╪╪╪╪╪╪╪╪【初始化Stack()】╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╡ Stack::Stack() //构造函数,置空栈 {
top=NULL; }
//╞╪╪╪╪╪╪╪╪╪【初始化~Stack()】╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╡ Stack::~Stack() //析构函数 { }
//╞╪╪╪╪╪╪╪╪╪【压栈函数】╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╡ void Stack::Push(T e) //把元素e压入栈中 { LinkNode *P; P=new LinkNode;
P->data=e; //链栈【头插法】,把e插到链头 P->next=top; top=P; }
//╞╪╪╪╪╪╪╪╪╪【出栈函数】╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╡
T Stack::Pop() //使栈顶元素出栈 { T Temp;
LinkNode *P; P=top;
top=top->next; //链栈【头取法】,把top所指data赋给Temp Temp=P->data; delete P; return Temp;
信息科学与工程学院 - 5- 网络工程11-1班
软件综合实习
}
//╞╪╪╪╪╪╪╪╪╪【取栈顶元素函数】╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╡ T Stack::GetPop() {
return top->data; }
//╞╪╪╪╪╪╪╪╪╪╪【清空栈函数】╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╡ void Stack::Clear() { top=NULL; }
//╞╪╪╪╪╪╪╪╪【判断栈空函数】╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╡ bool Stack::empty() //判断栈是否为空,如果为空则返回1,否则返回0 { if(top==NULL) return 1; else
return 0; }
//╞╪╪╪╪╪╪╪╪╪【函数声名】╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╡ int move[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
//定义当前位置移动的4个方向.【分别先向东、南、西、北】
bool Mazepath(string **maze,int m,int n);
//寻找迷宫maze中从(0,0)到(m,n)的路径, //如果到则返回true,否则返回false
void PrintPath(Stack p,int m,int n,string **maze); //输出迷宫的路径 void Restore(string **maze,int m,int n); //恢复迷宫 string ** GetMaze(int &m,int &n);
//获取迷宫,返回存取迷宫的二维指针
int a1,b1; //a1、b1分别为入口的行和列坐标 int c1,d1; //c1、d1分别为出口的行和列坐标
//╞╪╪╪╪╪╪╪╪【主函数】╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╡ int main(){
int m=0,n=0; //定义迷宫的长和宽
string **maze; //定义二维指针存取迷宫
printf(\◢■■◣◢■■◣ ◢■ ◢■■◣ ◢■■◣ ◢■■◣ ◢■ \\n\
printf(\ ■■ ■ ■ ■ ■ ■ ■ \\n\
printf(\◢■■◤■ ■ ■ ■■■■ 年 ■■■■ 月 ◢■■◤ ■ 号 \\n\
printf(\■ ■ ■ ■ ■ ■ ■ ■ ■ \\n\
printf(\◥■■■◥■■◤◥■■■◤◥■■◤ ◥■■◤ ◥■■■◥■■■◤ \\n\
信息科学与工程学院 - 6- 网络工程11-1班
软件综合实习
printf(\
printf(\━━━━━━━━━【作者】━━━━━━━━━━━━━━ \\n\
printf(\┃ ┃ \\n\
printf(\┃ ● 何天从 ┃ \\n\
printf(\┃ ● 网络工程专业 11-1班 ┃ \\n\
printf(\┃ ● 学号:3110757101 ┃ \\n\
printf(\┃ ● 信息科学与工程学院 ┃ \\n\
printf(\┃ ● 桂林理工大学 ┃ \\n\
printf(\┃ ┃ \\n\
printf(\━━━━━━━━━━━━━━━━━━━━━━━━━━━ \\n\ printf(\
printf(\┣━━━━━━━━━【迷宫路径探索】━━━━━━━━━┫ \\n\
printf(\┃ ┃ \\n\
printf(\┃ ⑴〖输入迷宫路径〗 ┃ \\n\
printf(\┃ ⑵〖清空屏幕〗 ┃ \\n\
printf(\┃ ⑶〖结束探索〗 ┃ \\n\
printf(\┃ ┃ \\n\
printf(\┣━━━━━━━━━━━━━━━━━━━━━━━━━━┫ \\n\
printf(\ while(1) { int j;
printf(\【请选择】操作:\ scanf(\ switch(j) {
case 1: { maze=GetMaze(m,n);
//调用GetMaze(int &m,int &n)函数,得到迷宫
信息科学与工程学院 - 7- 网络工程11-1班
软件综合实习
if(Mazepath(maze,m,n))
//调用Mazepath(int **maze,int m,int n)函数获取路径
{ } else {
cout<<\《抱歉》!此路径不通!\\n\\n\
printf(\┣━━━━━━━━━【迷宫路径探索】━━━━━━━━━┫ \\n\
printf(\┃ ┃ \\n\
printf(\┃ ⑴〖输入迷宫路径〗 ┃ \\n\
printf(\┃ ⑵〖清空屏幕〗 ┃ \\n\
printf(\┃ ⑶〖结束探索〗 ┃ \\n\
printf(\┃ ┃ \\n\
printf(\┣━━━━━━━━━━━━━━━━━━━━━━━━━━┫ \\n\
printf(\ }
printf(\ break; } case 2:
{ system(\//清屏函数
printf(\┣━━━━━━━━━【迷宫路径探索】━━━━━━━━━┫ \\n\
printf(\┃ ┃ \\n\
printf(\┃ ⑴〖输入迷宫路径〗 ┃ \\n\
printf(\┃ ⑵〖清空屏幕〗 ┃ \\n\
printf(\┃ ⑶〖结束探索〗 ┃ \\n\
printf(\┃ ┃ \\n\
printf(\┣━━━━━━━━━━━━━━━━━━━━━━━━━━┫ \\n\
printf(\ break; } case 3:
信息科学与工程学院 - 8- 网络工程11-1班
软件综合实习
return 0; default:
printf(\【输入有误】,请重新输入!\\n\ } } return 0; }
//╞╪╪╪╪╪╪╪【存储迷宫函数】╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╡ string ** GetMaze(int &m,int &n) //返回存取迷宫的二维指针 {
string **maze; //定义二维指针存取迷宫 int i=0,j=0;
cout<<\【请输入】迷宫的长和宽:\ int a,b;
cin>>a>>b; //输入迷宫的宽a和高b cout<<\【请输入】迷宫内容:\\n\
//m,n分别代表迷宫的行数m和列数n
n=a; m=b;
maze=new string *[m+2]; //申请长度等于行数加2的二级指针【这句就是给一个指向指针的指针动态分配m+2个存放int类型指针的数组,用于动态申请二维数组。】
for(i= 0;i maze[i]=new string[n+2]; } for(i=1;i<=m;i++) //输入迷宫的内容,0代表可通,1代表不通 { for(j=1;j<=n;j++) { cin>>maze[i][j]; } } for(i=0;i maze[i][0]=maze[i][n+1]=\■\//使纵向围墙为1,就是0列和6列纵向 } for(i=0;i maze[0][i]=maze[m+1][i]=\■\//使横向围墙为1,就是0行和6行横向 } return maze; //返回存贮迷宫的二维指针maze }; //╞╪╪╪╪╪╪【寻找迷宫路径函数】╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╡ bool Mazepath(string **maze,int m,int n) 信息科学与工程学院 - 9- 网络工程11-1班