任务描述
相关知识
编程要求
任务描述
本关任务:编写一个计算从起点找到目标点的过程需要多少步。
相关知识
前两关我们已经练习了分别通过DFS和BFS遍历所有的图结点,所以这是一种穷举式的查找方法。在遍历过程中如果记录到达每个结点的步数,则我们可以了解一下两种查找方法的时间性能特点。
具体方法是两种方法在输出结点的时候,同时计数。
编程要求
根据提示,在右侧编辑器补充代码,输出两种方法找到目标结点的步数。
开始你的任务吧,祝你成功!
#include <stdio.h>
#include "SeqQueue.h"
#define N 7
char Name[N+1]="ABCDEFG";
int Adj[N][N]=
{
//填写邻接矩阵
{0,1,1,0,0,0,0},
{0,0,0,1,0,0,0},
{0,0,0,1,1,0,0},
{0,0,1,0,0,1,1},
{0,0,0,1,0,0,1},
{0,0,0,0,0,0,1},
{0,0,0,0,0,0,0}
};
int count1=0;
int count2=0;
int visit[N]={0};
void DF(int i,int end){
count1++;
visit[i]=1;
for (int j = 0; j < N; ++j) {
if ( Adj[i][j]== 1 && visit[j]==0){
DF(j,end); // 对为访问的邻接顶点递归调用
}
}
}
int BFS(int start, int end){
//宽度优先,返回从start到end的访问结点数
int i, j;
int qu[100],f=0,r=0;
for (i = 0; i <N; ++i) {
visit[i] = 0;
}
i=start;
visit[i]=1;
qu[r++]=i;
while(f<r)
{
i=qu[f++];
for(j=0,j!=i;j<N;j++)
{
if(Adj[i][j]==1&&!visit[j])
{
visit[j]=1;
count2++;
qu[r++]=j;
}
}
}
return count2;
}
int DFS(int start, int end){
//深度优先,返回从start到end的访问结点数
int i;
// 初始化所有顶点状态都是未访问过状态
for (i = 0; i <N; ++i) {
visit[i] = 0;
}
//防止图为非联通的情况,遍历整个图
for (i = start; i < end; ++i) {
if (visit[i]==0){ // 若是连通图,只会执行一次
DF(i,end);
}
}
if(start==0)
return count1;
else return count1-1;
}
因篇幅问题不能全部显示,请点此查看更多更全内容