先上结果,请各位看官自行判断有没有继续往下读的必要。
规则介绍界面:
功能选择界面:
由系统创建的迷宫求解:
根据面向对象程序设计思想,根据需求分为三类:
//地图类:用一维数组储存地图的函数列数以及迷宫
class Map{
public:
int m,n;//m表示列数,n表示行数
int *map;
Map(int m1, int n1, int x[]){
m=m1;
n=n1;
map= new int[m*n];
for(int i=0;i<m*n;i++){
map[i]=x[i];
}
}
~Map(){
delete []map;
}
void printoutMap();
friend int searchright(int &i, int &j, int &d,Map &m);
friend int searchdown(int &i, int &j, int &d,Map &m);
friend int searchleft(int &i, int &j, int &d,Map &m);
friend int searchup(int &i, int &j, int &d,Map &m);
friend int findroute(int i, int j, int d, LinkQueue &last, LinkStack &sel, Map &ma);
friend void figureoutMaze(LinkQueue &route,Map &m);
};
//结点结构体
struct Node{
int i,j,d;
struct Node *next;
};
//队列:存储每一个可行的全部链路
class LinkQueue{
private:
Node *front, *rear;
public:
LinkQueue(){ //构造函数
front = new Node;
front->next = NULL;
rear = front;
}
~LinkQueue(){ //析构函数
Node *i;
i = front->next;
for(;front != rear;){
delete front;
front = i;
i = i->next;
}
delete rear;
}
void makeEmpty(){ //置空
Node *i=front->next;
if(front->next==NULL){
return;
}
for(;i != NULL;i=front->next){
front->next = i->next;
delete i;
}
rear=front;
}
int size(){ //队列的长度
int i=0;
Node *p;
for(p=front->next;p!=NULL;p=p->next){
i++;
}
return i;
}
void enQueue(int &i1,int &j1,int &d1){ //入队操作
Node *s = new Node;
s->i = i1;
s->j = j1;
s->d = d1;
s->next = NULL;
rear->next = s;
rear = s;
}
int deQueue(int &i2,int &j2,int &d2){ //出队操作
if(isEmpty()){
return 0;
}
Node *p = front->next;
i2 = p->i;
j2 = p->j;
d2 = p->d;
front->next = p->next;
if(p->next == NULL){
rear = front;
}
delete p;
return 1;
}
void getQueue(int &i3,int &j3,int &d3){ //取队头
i3 = front->next->i;
j3 = front->next->j;
d3 = front->next->d;
}
bool isEmpty(){ //判断队是否为空
return (front == rear)? true:false;
}
int search(int &i4,int &j4,int &d4){ //判断队里已有的点
for(Node *p=front->next;p!=NULL;p=p->next){
if((p->i==i4)&&(p->j==j4)){
return 1;
}
}
return 0;
}
int traverse(int &i5,int &j5,int &d5){ //遍历查找
Node *p=front->next;
for(;p!=NULL;p=p->next){
if((p->i==i5)&&(p->j==j5)){
d5=p->d;
return 1;
}
}
return 0;
}
friend int findroute(int i, int j, int d, LinkQueue &last, LinkStack &sel, Map &ma);
friend void copyto(LinkQueue &pas,LinkQueue &ini,int i,int j, int d);
friend void copyall(LinkQueue &pas,LinkQueue &ini);
friend void figureoutMaze(LinkQueue &route,Map &m);
};
//栈:存储查找过程中所遇到的多路选择
class LinkStack{
private:
Node* top;
public:
LinkStack(){ //构造函数
top = NULL;
}
~LinkStack(){ //析构函数
if(isEmpty()){
}
else{
Node* i=top->next;
for(;i!=NULL;i=top->next){
top->next= i->next;
delete i;
}
delete top;
}
}
void Push(int &i1,int &j1,int &d1){ //入栈
Node* p;
p=new Node;
p->i = i1;
p->j = j1;
p->d = d1;
if(top==NULL){
top=p;
p->next=NULL;
}
else{
p->next=top;
top=p;
}
}
int Pop(int &i2,int &j2,int &d2){ //出栈
Node* p;
if(top==NULL){
return 0;
}
p=top;
top=p->next;
i2 = p->i;
j2 = p->j;
d2 = p->d;
delete p;
return 1;
}
void getTop(int &i3,int &j3,int &d3){ //取栈顶
i3 = top->i;
j3 = top->j;
d3 = top->d;
}
bool isEmpty(){ //判断队是否为空
return (top == NULL)? true:false;
}
friend int findroute(int i, int j, int d, LinkQueue &last, LinkStack &sel, Map &ma);
};
主函数:先进行界面函数调用并且进入功能选择,确定是使用系统已经定义的地图还是让用户自行输入地图。接着进入循环,最初在栈不空时先出栈,调用寻找路线的函数,如果成功找到路线,则调用输出函数并判断该路线是否为最短通路,如果此时栈不为空则重复循环。最后输出迷宫的最短解。
寻找最短路径函数:以0和1分别表示迷宫地图中可以走的通路和路障。从(1,1)点开始分别判断上下左右中除了来时的方向以外的其他三个方向是否可以通过,按照一定顺序将所有可选方向可选则入栈,再出栈顶按照此方向一直向下进行寻路。如果寻路到终点或是无路可走则退出,判断栈是否为空,若不为空则将重复出栈寻路过程,直至所有路线都被寻找到。其中每当判断出一条完整的通路以后,将它与最短的通路作比较,如果它短于最短的路线则赋值给储存最短路线的对象。
涉及的问题以及解决方式:
如果需要的人多的话我就上传完整的代码资源吧,感谢你的阅读,祝各位看官好运。