第六章小结
首先是图的遍历的两种方法:深度优先搜索、广度优先搜索
图的遍历:从图中某个顶点出发,访问遍历图中其余顶点,并使图中的每个顶点都仅被访问一次的过程。
DFS:从图中某顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发
深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到
(1)递归过程
(2)设访问标志数组visited[n]区别顶点是否被访问
BFS:在访问了起始点v0之后,依次访问 v 0的邻接点,
然后再依次访问这些顶点中未被访问过的邻接点; 直到所有顶点都被访问过为止。
(1)分层搜索
(2)1.从图中某个顶点v出发,访问v,并置visited[v]的值为true,然后将v 进队。
2.队列为不空,则: 1)队头顶点u出队。
2)依次检查u的所有邻接点w,如果visited[w]的值为false,则访问w,并置visited[w]的值为true,然后将w 进队。
接下来说一下这个“拯救007”吧,这个“拯救007”我真是醉了,007腿长一点一步跨过去不就好
1 if(d>=42.5)
2 {//若007腿像我一样长一步就能跨到对岸那肯定是没问题的啦
3 cout<<"Yes"<<endl;
4 }
5 else
6 {
7 for(i=0;i<n;i++)
8 {
9 if(!visited[i]&&first(i))
10 {//对尚未访问的邻接顶点且第一步能踩到鳄鱼头上递归调用 DFS
11 dfs(i);
12 }
13 }
14 if(flag == 1) //若能到达对岸(即flag为1),则输出“Yes”;否则,反之
15 cout<<"Yes"<<endl;
16 else
17 cout<<"No"<<endl;
所以说,。。。。。。,但是007就是得要刺激一点,所以我们要判断是否不葬身鳄鱼口中。这是能通过的条件,不然,就等那些鳄鱼全饿死了再游过去吧。
而核心思想是能一步一步过:
1 int jump(int i,int j)
2 {//能否从一个鳄鱼头跳到另一个鳄鱼头
3 int p1 = pow(p[i].x - p[j].x,2);
4 int p2 = pow(p[i].y - p[j].y,2);//一个鳄鱼头与另一个鳄鱼头的坐标差值范围
5 int r = d*d;
6 if(p1+p2<=r) //比较判断是否能够到达那个范围,即两个坐标之间的距离是否在 007一次能跳跃的最大距离的范围内
7 return 1;
8 return 0;
9 }
这个时候就需要判断了,也就是我们这里需要用到的DFS:
1 int dfs(int t)
2 {//深度优先搜索遍历连通图
3 visited[t] = 1;
4 if(succeed(t) == 1)
5 {
6 flag = 1; //成功,标志为1
7 }
8 for(int i=0;i<n;i++)
9 {
10 if(!visited[i]&&jump(t,i))
11 {//若未曾访问过且能从一个鳄鱼头跳到另一个鳄鱼头(即到达下一个顶点)
12 flag = dfs(i); //递归调用,判断是否成功,将判断的标志值赋予标志值
13 // if(flag == 1)
14 // break;
15 }
16 }
17 return flag;
18 }
做完这些后,也差不多了,接下来,看完整版的 007VS鳄鱼 吧:
▄︻┻═┳
︻┳═一
▄︻┳一·
▄︻┳═一
︻┳═一oO
︻︼─一
▄︻┻┳═一
▄︻┳一
▄︻┻═┳一
▄︻┳-一
(想什么呢,最好的方法当然是给007配把枪啊,007你自己挑)
1 #include<iostream> 2 #include<cmath> 3 4 using namespace std; 5 struct node 6 { 7 int x,y; 8 }p[1000]; //定义结构体,为鳄鱼的可能坐标 9 int visited[1000]; //访问标志数组 10 int flag = 0; //到达对岸的标志,能flag为1;否flag为0。先初始化为0 11 int n,d; //鳄鱼数量,007一次能跳跃的最大距离 12 int succeed(int i) 13 {//成功到达岸边 14 if((p[i].x - d<=-50)||(p[i].x + d>=50)||(p[i].y - d<=-50)||(p[i].y + d >=50)) //从原点起判断距离是否超出方形域 15 return 1; 16 return 0; 17 } 18 int first(int i) 19 {//第一步能否跳到鳄鱼头上 20 int p1 = pow(p[i].x,2); //pow 函数为求幂函数 21 int p2 = pow(p[i].y,2); //计算坐标范围 22 int r = (d+7.5)*(d+7.5); 23 if(p1+p2<=r) //比较判断是否能够到达那个范围 24 return 1; 25 return 0; 26 } 27 int jump(int i,int j) 28 {//能否从一个鳄鱼头跳到另一个鳄鱼头 29 int p1 = pow(p[i].x - p[j].x,2); 30 int p2 = pow(p[i].y - p[j].y,2);//一个鳄鱼头与另一个鳄鱼头的坐标差值范围 31 int r = d*d; 32 if(p1+p2<=r) //比较判断是否能够到达那个范围,即两个坐标之间的距离是否在 007一次能跳跃的最大距离的范围内 33 return 1; 34 return 0; 35 } 36 int dfs(int t) 37 {//深度优先搜索遍历连通图 38 visited[t] = 1; 39 if(succeed(t) == 1) 40 { 41 flag = 1; //成功,标志为1 42 } 43 for(int i=0;i<n;i++) 44 { 45 if(!visited[i]&&jump(t,i)) 46 {//若未曾访问过且能从一个鳄鱼头跳到另一个鳄鱼头(即到达下一个顶点) 47 flag = dfs(i); //递归调用,判断是否成功,将判断的标志值赋予标志值 48 // if(flag == 1) 49 // break; 50 } 51 } 52 return flag; 53 } 54 int main() 55 { 56 int visited[]={0};//初始化访问标志数组 57 cin>>n>>d; //输入鳄鱼数量和007一次能跳跃的最大距离 58 int i; 59 for(i=0;i<n;i++) 60 {//循环输入鳄鱼的坐标位置 61 cin>>p[i].x>>p[i].y; 62 } 63 if(d>=42.5) 64 {//若007腿像我一样长一步就能跨到对岸那肯定是没问题的啦 65 cout<<"Yes"<<endl; 66 } 67 else 68 { 69 for(i=0;i<n;i++) 70 { 71 if(!visited[i]&&first(i)) 72 {//对尚未访问的邻接顶点且第一步能踩到鳄鱼头上递归调用 DFS 73 dfs(i); 74 } 75 } 76 if(flag == 1) //若能到达对岸(即flag为1),则输出“Yes”;否则,反之 77 cout<<"Yes"<<endl; 78 else 79 cout<<"No"<<endl; 80 } 81 return 0; 82 }
好啦,到此就先告一段落吧~(回去给007买枪啦~~~)