本专题属于数据结构:栈部分;
本程序用于二维层面寻找可通过路径,以1和0区分是否,可通过。寻找路径,需要考虑走过的四个方向,或是8个方向。在对已经走过的地方,进行标注,防止在某一处重复检索。
具体实现直接看程序
#include<iostream>
#include<stack>
using namespace std;
class point
{
public:
int x;
int y;
point(int x, int y)
{
this->x = x;
this->y = y;
}
point()
{
x = y = 0;
}
};
point change(int i, point& m)//四个方向进行改变
{
switch (i)
{
case 1:
return point(m.x + 1, m.y);
case 2:
return point(m.x, m.y + 1);
case 3:
return point(m.x - 1, m.y);
case 4:
return point(m.x, m.y - 1);
}
}
int check(point& m,int map[15][15])//用来检查该点是否可通行,或者是否到了终点
{
if (map[m.x][m.y] == 3)
return 1;
if (map[m.x][m.y] == 0)
{
return -1;
}
else return 0;
}
void Getpath(stack<point>& m, int map[15][15])
{
int temp = 0;
point a;
cout << "路径是:" << endl;
int i;
while (temp != 1)
{
for (i = 1; i <= 4; i++)
{
a = change(i, m.top());
temp = check(a, map);
if (temp == 1 || temp == -1)
{
m.push(a);
map[a.x][a.y] = 4;//对走过的点进行标记
break;
}
}
if (i == 5) m.pop();
}
}
int main()
{
stack<point> m;
//零不可走,1可走,3为终点
int map[15][15] = { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1 },
{ 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1 },
{ 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1 },
{ 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1 },
{ 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1 },
{ 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1 },
{ 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } };
point n(4, 2);
m.push(point(1,1));
Getpath(m, map);
while(!m.empty())
{
point a;
a = m.top();
m.pop();
cout << "("<<a.x<<","<< a.y<<")"<<endl;
}
}
欢迎关注公众号:一起自学计算机技术啊(微信栏搜索→公众号→一起自学计算机技术啊),里面有数百本计算机方面的书籍以及数学建模的资料,
公众号二维码