DFS(深度优先搜索)弊端:不一定是最优路径

#include<iostream>
#include<stack>
using namespace std;
struct point//点的结构体
{
point(int x,int y) :x(x), y(y){}//带参构造
point(){};//无参构造
point &operator=(point & a)//重载=
{
x = a.x;
y = a.y;
return *this;
}
point operator+(point & a)//重载+
{
point t;
t.x=x + a.x;
t.y=y + a.y;
return t;
}
bool operator==(point& a)//重载==
{
return (x == a.x)&&(y == a.y);
}
int x;
int y;
};
struct parr//定义辅助数组,在辅助数组中求路径
{
int arr;
bool isFind;
};
int  main()
{
int arr[12][12] =//定义一个二维数组map图
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1,
 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1,
 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1,
 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
point  Direction[4] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };//定义四个方向
point Beginpoint (2,1);//开始点
point Endpoint(10, 9);//终点
stack<point> Msd;//定义一个栈
Msd.push(Beginpoint);//压入起点
parr Parr[12][12];//第一辅助数组
for (unsigned i = 0; i < 12; ++i)//拷贝map二维数组的值
{
for (unsigned j = 0; j < 12; ++j)
{
Parr[i][j].arr = arr[i][j];
Parr[i][j].isFind = false;
}
}
point Current;//当前点
Current=Beginpoint;//当前点为起点
while (true)
{
for (unsigned i = 0; i < 4; ++i)//循环四个方向
{
point ptemp = Current + Direction[i];
if ((Parr[ptemp.x][ptemp.y].arr == 0) && !Parr[ptemp.x][ptemp.y].isFind)//满足条件压入栈改变访问权限并改变当前点跳出循环
{
Msd.push(ptemp);
Parr[ptemp.x][ptemp.y].isFind = true;
Current = ptemp;
break;
}
else if (i==3)//如果四个方向都不能访问删除该点并将上个点赋值给当前点
{
Msd.pop();
if (!Msd.empty())//最后一个点(起点)要注意
  Current = Msd.top();
break;
}
}
if (Msd.empty())//栈为空时无路径
{
cout << "无法到达" << endl;
break;
}

if (Current == Endpoint)//找到终点
{
break;
}
}
while (!Msd.empty())
{
cout << Msd.top().x << "\t" << Msd.top().y << endl;//循环打印路径
Msd.pop();
}
system("pause");
return 0;

}

运行结果如下:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值