待解决问题:
心理学家把一只老鼠从一个无顶盖的大盒子的入口赶进迷宫,迷宫中设置很多隔壁,对前进方向形成了多处障碍,心理学家在迷宫的唯一出口放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口。
这个题目的本质是迷宫找路问题,再次笔者以c++语言使用结构体和栈等数据结构来解决此问题。
代码实现如下:
#include <iostream>
using namespace std;
struct Point //结构体 保存位置的坐标
{
int x;
int y;
};
void xz(int dt[][10], Point s, Point e); //找路径
void ot(int dt[][10]); //打印迷宫和路径
int dt[10][10]={
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, // 迷宫图
{-1, 0, -1,-1, 0, 0, 0,-1, 0,-1},
{-1, 0, 0, 0, 0,-1,-1, 0, -1,-1},
{-1, 0,-1,-1,-1, 0, 0, 0, 0,-1},
{-1, 0, 0, 0,-1, 0, 0, 0, 0,-1},
{-1, 0,-1, 0, 0, 0,-1, 0, 0,-1},
{-1, 0,-1, 0,0,0,-1,0, 0,-1},
{-1, 0,-1,-1,-1,0,-1,-1,0,-1},
{-1,-1, 0,0,0,0,0,0,0,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}};
void main()
{
Point s={1,1};
Point e = {8,8};
xz(dt,s,e);
ot(dt);
}
void ot(int dt[][10])
{
for (int i=0;i<10;i++)
{
for (int j=0;j<10;j++)
{
if (dt[i][j]==-1) cout<<"■";
else if (dt[i][j]==2) cout<<" *";
else cout<<"□";
}
cout<<endl;
}
cout<<endl;
}
void xz(int dt[][10], Point cur, Point end)
{
Point Stack[128]; //栈 保存当前的位置
int top = -1;
do
{
dt[cur.x][cur.y] = 2;
Stack[++top].x = cur.x;
Stack[top].y = cur.y;
if (dt[cur.x-1][cur.y] == 0) //向上走
cur.x--;
else if (dt[cur.x][cur.y+1] == 0) //向右走
cur.y++;
else if (dt[cur.x+1][cur.y] == 0) //向下走
cur.x++;
else if (dt[cur.x][cur.y-1] == 0) //向左走
cur.y--;
else
{
dt[Stack[top].x][Stack[top].y] = 1;
top--;
cur.x = Stack[top].x;
cur.y = Stack[top].y;
top--; //当前位置走不通 出栈
}
}while ((top!=-1) &&((cur.x != end.x) || (cur.y!=end.y)));
if((cur.x ==end.x) && (cur.y==end.y))
dt[cur.x][cur.y] = 2;
if(top==-1)
cout<<"此迷宫无出口"<<endl;
else
cout<<"此迷宫的出口如下"<<endl;
}
此代码较为简单,读者们感兴趣的话可以将此代码拷贝到visual studio中进行测试,当然也可以到以下链接来下载.c文件
连接:http://download.csdn.net/download/qq_28734159/10193533
代码运行之后的效果截图如下:
关键算法分析:
#include <iostream>
using namespace std;
struct Point //结构体保存位置的坐标
{
intx; //横坐标
inty; //纵坐标
};
void xz(int dt[][10], Point s, Pointe); //找路径
void ot(int dt[][10]); //打印迷宫和路径
int dt[10][10]={
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, // 迷宫图
{-1, 0, -1,-1, 0, 0, 0,-1, 0,-1},
{-1, 0, 0, 0, 0,-1,-1, 0, -1,-1},
{-1, 0,-1,-1,-1, 0, 0, 0, 0,-1},
{-1, 0, 0, 0,-1, 0, 0, 0, 0,-1},
{-1, 0,-1, 0, 0, 0,-1, 0, 0,-1},
{-1, 0,-1, 0,0,0,-1,0, 0,-1},
{-1, 0,-1,-1,-1,0,-1,-1,0,-1},
{-1,-1, 0,0,0,0,0,0,0,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}};
void main()
{
Point s={1,1}; // 起点位置
Pointe = {8,8}; // 终点位置
xz(dt,s,e); //找路径
ot(dt); //输出找到的路径
}
void ot(int dt[][10]) //输出找到的路径的函数
{
for(int i=0;i<10;i++) //外层for循环
{
for(int j=0;j<10;j++) //内层for循环
{
if(dt[i][j]==-1) cout<<"■"; //数值是-1输出墙壁
elseif (dt[i][j]==2) cout<<" *"; //数值是2,输出路径
elsecout<<"□"; //否则输出未走的地方
}
cout<<endl;
}
cout<<endl;
}
void xz(int dt[][10], Point cur, Pointend)
{
PointStack[128]; //栈 保存当前的位置
inttop = -1;
do
{
dt[cur.x][cur.y]= 2; //假设当前位置能走通
Stack[++top].x= cur.x; //将能走通的位置入栈
Stack[top].y= cur.y;
if(dt[cur.x-1][cur.y] == 0) //向上走
cur.x--;
elseif (dt[cur.x][cur.y+1] == 0) //向右走
cur.y++;
elseif (dt[cur.x+1][cur.y] == 0) //向下走
cur.x++;
elseif (dt[cur.x][cur.y-1] == 0) //向左走
cur.y--;
else //四个方向都走不通
{
dt[Stack[top].x][Stack[top].y]= 1; //标志位当前位置走不通
top--; //当前位置出栈
cur.x= Stack[top].x; //回溯到上一位置
cur.y= Stack[top].y; //回溯到上一位置
top--; //当前位置走不通 出栈
}
}while((top!=-1) &&((cur.x != end.x) || (cur.y!=end.y))); //循环结束的条件 当栈为空(无路能走到终点)或者走到终点
if((cur.x==end.x) && (cur.y==end.y)) //若走通,将最后的位置标记为走通
dt[cur.x][cur.y] = 2;
if(top==-1) //栈为空,该迷宫无路
cout<<"此迷宫无出口"<<endl;
else //输出能走出该迷宫的路径
cout<<"此迷宫的出口如下"<<endl;
}