一、图
1. 图的组成
图由顶点和边组成(顶点也称为节点或交点,边也称为链接),顶点用圆圈表示,而边就是圆圈间的连线,如:
2. 图的分类
图分为无向图和有向图,例如上图即为无向图,边无方向;而有向图是指边有方向,有指向性,单向性的,如:
若从图的一个顶点开始,沿一条路走能够回到最初的顶点,此图就含有圈(圈只会出现在无向图中,也就是说可以沿此路返回);图中顶点连的边的数量叫做此顶点的度,而边可以被赋予一个正数或负数称为其权重。若图中任意两个顶点之间都有边,则此图为连通图;否则,为非连通图。
二、深度优先搜索(DFS)
1. 基本思路
DFS是通过递归思想实现的,即找到代码的相同部分以重复调用。其基本思路为:以一顶点作为起点,沿着一条路一直走到要到达的位置或超出边界(注意:每个经过的点都要标记以免在同一条路径上重复经过),之后要将此点删除标记,并返回上一步尝试其他路径(删除是因为走其他路也可以经过此点),直到从起点可到达的点都被标记。
2. 实现代码
void dfs(int x,int y,int step)
{
int i,zx,zy;
if(x==p&&y==q)//判断到达指定位置
{
printf("%d\n",step);
return ;//返回上一步
}
for(i=0;i<=3;i++)
{
//左下上右的顺序
zx=x+next[i][0];
zy=y+next[i][1];
if(zx<1||zx>n||zy<1||zy>m)//判断超界
continue;
if(a[zx][zy]==0&&book[zx][zy]==0)//判断是否为障碍或已经过的点
{
book[zx][zy]=1;//标记
dfs(zx,zy,step+1);//递归,步数加1
book[zx][zy]=0;//清除标记
}
}
return ;
}
三、广度优先搜索(BFS)
1. 基本思想
BFS通过逐层遍历访问所有对象实现的,即从一顶点开始将其下一层的直接连接的所有点遍历,再按顺时针或逆时针的顺序以该顶点周围某一点为起始点来遍历它的下一层(注意同一点不能重复经过),以此类推,直到标记所有可到达的点找到要到的顶点为止。
2. 实现代码
bool bfs(Note &n,Note &m)
{
queue<Note> Q;//定义结构体变量的队列
Note s,l;
Q.push(n);
n.flag=1;//标记
while(!Q.empty())//队列不为空,继续
{
s=Q.front();//取出队列中的第一个结构体
Q.pop();//从队列中移除
if(s.x==m.x&&s.y==m.y)//到达指定位置
{
return true;
}
for(i=0;i=3;i++)
{
l.x=s.x+k[i][0];
l.y=s.y+k[i][1];
if(l,x<1||l.x>r||l.y<1||l.y>t)//超出边界继续循环
continue;
if(l.flag==0&&l.z==0)//判断为合法点
{
l.flag=1;//标记
Q.push(l);
}
}
}
return false;
}