首页 > 其他 > 详细

第六章习题练习

时间:2019-05-19 23:22:29      阅读:138      评论:0      收藏:0      [点我收藏+]

 

前情提要:

007有危险啦!这次让我们来一次拯救吧!

回顾题目(推眼镜,假装柯南附身):

技术分享图片

思路:

这道题目需要朋友们非常的细致,因为可考虑的情况有很多。例如:①第一次就可以直接跳到岸上;②第一次跳到鳄鱼之后就可以跳到岸上;③跳完鳄鱼之后还得跳鳄鱼。

面对这几种情况,我们可分别列出判断条件:①D>=50-7.5 ②D>= 50-| x |  || D>= 50-| y | ③D*D >= (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)

这就初步提醒我们要构建至少三个函数啦!

解题

OK,有了思路之后就让我们顺藤摸瓜、快乐地解题吧:

①自然是少不了我们的定义啦:

#include<iostream>
using namespace std;
#define MAXSIZE 100
#define YES 1
#define NO 0
int D;  
int N;                                                    //007一次能跳跃的距离 
int Visited[MAXSIZE];                                     //标记矩阵 
void setVisit()                                           //初始化标记矩阵
{
    for(int i=0;i<MAXSIZE;i++)
        Visited[i]=0;
}                                                        
struct Point                                              //存储鳄鱼的坐标 
{
    int x;
    int y; 
}Point[MAXSIZE];

 

②三种情况也要登场咯:

int straight(int D)//判断能否一次性跳到岸边
{
    if(D>=50-7.5)
       return YES;
    else return NO;
}
int FirstJump(int i)                                     //第一次从小岛跳到鳄鱼头上 
{
    int x=Point[i].x;
    int y=Point[i].y;
    if((D+7.5)*(D+7.5)>=(x*x+y*y))
        return YES;
    else return NO;
}
int Jump(int i,int j)                                    //判断能否从一只鳄鱼跳到另一只鳄鱼头上 
{
    int x1=Point[i].x;
    int y1=Point[i].y;
    int x2=Point[j].x;
    int y2=Point[j].y;
    if(D*D>=(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))
        return YES;
    else return NO;
}
int IsSafe(int i)                                        //判断能否从鳄鱼跳到岸上 
{
    int x=Point[i].x;
    int y=Point[i].y;
    if(x<0)
        x=-x;
    if(y<0)
        y=-y;
    if(D>=50-x||D>=50-y)
        return YES;
    else return NO;
} 

③可别忘了,三种情况都是为了解救007服务的,所以我们需要有个小总结函数,即真正解救007的关键函数:

int DFS(int i)
{
    int answer;
    Visited[i]=true;
    if(IsSafe(i)) answer=YES;
    else
    {                                                          //循环遍历每个节点
        for(int j=0;j<N;j++)
        {                                                      //如果该节点未被访问,且能从j结点跳至j结点
            if(!Visited[j]&&Jump(i,j)){
                answer=DFS(j);
                if(answer==YES)  break;
            }
        }
    }
    return answer;
}
void Save007()
{
    int answer;
    setVisit();                                                //初始化标记矩阵
    for(int i=0;i<N;i++)
    {
        if(!Visited[i]&&FirstJump(i))
            answer=DFS(i);
            if(answer==YES) break;
    }
    if(answer==YES)
        cout<<"Yes";
    else
        cout<<"No";
}

④嘿嘿,是不是很期待main函数呢:

int main(){
    cin>>N;
    cin>>D;
    for(int i=0;i<N;i++){
        cin>>Point[i].x;
        cin>>Point[i].y;
    }
    Save007();
    return 0;
}

That‘s all!这道题就解决啦。还是那句老话:拿到题目,冷静分析,理清思路,逐项突破。代码题就像一只只小鳄鱼,别怕,不凶的。多跳跳既好玩又锻炼能力。放心吧,总有一天,会上岸的。

反思:

最大的检讨就是上次没能参加数据结构小测!!!因为有要紧事要外出,就没能赶上,啊,我也不知道怎么说了,只能哭戚戚... 没关系,明天刚好还有一次小测,是检测图的内容。因为之前那件要紧事耽误了一些课程,也因为图比较复杂吧,感觉图的知识学得不十分好。但是!我会尽力的!嘿嘿,期待明天的表现吧~ 

上次忘记写目标了,其实目标在我心里呢,是要把之前耽误的一些课程给赶上。因为忙到这星期,所以目标只完成了估摸着一半(严厉批评!)。我不想看到自己变成落下课业的孩子啊,所以这星期的目标是把之前没补完的知识点补上(在周三前完成),星期一的小测得认认真真准备、认认真真考。PTA上第六章的作业和实践得在星期四完成,星期五得把这章的知识点做系统的总结(这应该在这周末完成的,可是因为上星期任务的延迟,只能这样尽快补了)。星期六早晨预习新课内容,中午列期末复习计划,下午开始就一定一定得进入期末复习阶段啦(如果想在期末考高分,就必须得这样做)!我喜欢很充实的生活,我不嫌忙的,适当的忙让我感到活着与快乐。

这次就到这里啦,各位回见!

 

第六章习题练习

原文:https://www.cnblogs.com/Haylie/p/10891334.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!