第六章小结

首先是图的遍历的两种方法:深度优先搜索广度优先搜索

图的遍历:从图中某个顶点出发,访问遍历图中其余顶点,并使图中的每个顶点都仅被访问一次的过程。

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 }
View Code

这个时候就需要判断了,也就是我们这里需要用到的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 }
View Code

做完这些后,也差不多了,接下来,看完整版的   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

 

 

好啦,到此就先告一段落吧~(回去给007买枪啦~~~)

posted @ 2019-05-19 20:44  双眸失神为我撩人  阅读(159)  评论(0编辑  收藏  举报