前情提要:
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