数据结构(图像的深度遍历)
看浙大老师的数据结构里出了一道题目
题目:
输入任意坐标,起点和终点,可到达半径,判断起点是否能到达终点。当然广度遍历也可以实现,这里用深度遍历更好些。
代码实现全在头文件里,方便看,仅供参考,有什么更好的实现方法欢迎交流。
#pragma once
#include <math.h>
#include <iostream>
#include <vector>
using std::vector;
struct coordinate {
int x;
int y;
bool visited;
explicit coordinate(int iX = 0, int iY = 0, bool bVisted = false)
: x(iX), y(iY), visited(bVisted){
};
int operator-(const coordinate& coord)
{
return sqrt(pow(x - coord.x, 2) + pow(y - coord.y, 2));
}
};
class Graph
{
public:
void PushCoordinate(coordinate* coord)
{
m_graph.push_back(coord);
}
void PushCoordinate(std::initializer_list<coordinate*> initialList)
{
for (auto& i : initialList)
PushCoordinate(i);
}
void PushDestination(coordinate* coord)
{
m_dest = coord;
}
void SetRadiu(int radius)
{
m_radius = radius;
}
void IfReachDest(coordinate* start)
{
if (Dfs(start))
std::cout << "Reach" << std::endl;
else
std::cout << "Can't reach" << std::endl;
}
private:
vector<coordinate*> GetAvailReachCoordinate(coordinate* coord)
{
vector<coordinate*> reachCoordinate;
for (auto& temp : m_graph)
{
if (!temp->visited && *temp - *coord < m_radius)
reachCoordinate.push_back(temp);
}
return reachCoordinate;
}
bool ReachDest(coordinate* coord)
{
if (*coord - *m_dest < m_radius)
return true;
else
return false;
}
bool Dfs(coordinate* coord)
{
if (ReachDest(coord))
return true;
vector<coordinate*> availReachCoord = GetAvailReachCoordinate(coord);
for (auto& temp : availReachCoord)
{
temp->visited = true;
bool bReach = Dfs(temp);
if (bReach)
return true;
}
return false;
}
private:
vector<coordinate*> m_graph;
coordinate* m_dest;
int m_radius;
};