【PTA】7-3 拯救007(C++)代码实现 & 易错点反思

题目见下:

输入样例

14 20
25 -15
-25 28
8 49
29 15
-35 -2
5 28
27 -29
-8 -28
-20 -35
-25 -20
-13 29
-30 15
-35 40
12 12

//输入上述数据后输出“Yes”

AC代码如下:

#include<bits/stdc++.h>
using namespace std;
#define sz 100
typedef struct node{
	int x, y;
}Node;
Node cro[sz];
set<int>win;
set<int>visited;

int check_start(int i, int d)//是否可以从岸上一步到达
{
	if(pow(cro[i].x, 2.0) + pow(cro[i].y, 2.0) <= pow(d + 7.5, 2.0))
	{
		return 1;
	}
	return 0;
}

int check_jump(int i, int n, int d)//递归判断是否可逃出生天
{
	visited.insert(i);
	if(win.count(i))//主要是针对第一次调用就成功的情况
	{
		return 1;
	}
	int x = cro[i].x;
	int y = cro[i].y;
	for(int j=0; j<n ; j++)
	{
		if(visited.count(j)) continue;
		int j_x = cro[j].x;
		int j_y = cro[j].y;
		if(pow(abs(j_x - x), 2.0) + pow(abs(j_y - y), 2.0) <= pow(d, 2.0))
		{
			if(win.count(j))
			{
				return 1;
			}
			if(check_jump(j, n, d))//递归遍历,类似DFS思想
			{
				return 1;
			}
		}
	}
	return 0;
}

int main()
{
	int n, d;
	cin>>n>>d;
	for(int i=0; i<n; i++)
	{
		cin>>cro[i].x>>cro[i].y;
		if(50 - abs(cro[i].x) <= d || 50 - abs(cro[i].y) <= d)
		{
			win.insert(i);
		}
	}
	if(win.empty()) //没有到岸边距离小于步长的点,提前结束
	{
		cout<<"No";
		return 0;//记得终止程序
	}
	for(int i=0; i<n; i++)
	{
		if(check_start(i, d) == 0) continue;//离岛太远
		visited.clear();
		if(check_jump(i, n, d))
		{
			cout<<"Yes";
			return 0;
		}
	}
	cout<<"No";
}

检查了半天仍然查不出的问题:

1. 当考虑特殊情况要提前结束程序时,别忘了return,不然继续运行后面的程序会导致奇怪的错误。//对应main中代码:

    if(win.empty()) //没有到岸边距离小于步长的点,提前结束
    {
		cout<<"No";
		return 0;//记得终止程序
	}

2.对函数进行递归操作时,尤应注意考虑第一次调用(即函数第一次执行,还没有进入递归)是否就符合win的条件了。//对应check_jump中代码:

int check_jump(int i, int n, int d)//递归判断是否可逃出生天
{
	visited.insert(i);
	if(win.count(i))//主要是针对第一次调用就成功的情况
	{
		return 1;
	}
}

~希望对你有启发~

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值