浙江大学数据结构MOOC-课后习题-第六讲-图2 Saving James Bond - Easy Version

题目汇总
浙江大学数据结构MOOC-课后习题-拼题A-代码分享-2024

题目描述

在这里插入图片描述

测试点

在这里插入图片描述

思路分享

①解题思路概览
我的想法是,先建立一个图,然后再利用DFS或者BFS来遍历判断当前顶点能否跳到岸上去
②怎么建图?

  • 首先要考虑采用什么数据结构来存储图?
    由于题目中的坐标是存在负数的,所有坐标不好和邻接矩阵数组下标一一对应,因此我选择使用邻接表来存储图

  • 接下来要考虑的是,怎么来建立顶点?
    我这里是将所有鳄鱼,以及湖心都作为了节点,因此建立的顶点数要在输入的N的基础上再加1

  • 那么怎么建立边呢?
    我们要注意到题目中有一个条件是james的跳跃距离D,只要他目前所处的位置到任意一个顶点的距离小于等于D,那么他就能跳过去,然后就可以建立一条边(后续判断是否上岸也是根据这个D来进行判断)(本考研鼠鼠对上岸这个词有点敏感了hhhh)

但需要注意一点,由于我把湖心也作为了顶点,所以它和鳄鱼之间也要建立边。它和鳄鱼之间的距离的计算公式中,还要减去中心岛的半径(题目中是7.5

③怎么遍历所有节点呢
遍历所有节点有两种方式:BFS或者DFS;由于我想到BFS要使用队列,感觉会麻烦一点,所以选择了DFS。
DFS的代码逻辑就是:

  • 先判断当前节点是否已访问过;(因此要建立一个数组来存储当前顶点是否被访问过)
  • 再访问当前节点(在本题中这一步就是判断是否能够逃脱,具体怎么判断请看后文)
  • 然后遍历访问当前节点的所有邻接点(这一步使用循环+DFS递归)

④怎么判断是否能够逃脱上岸呢
首先我们以湖心为坐标原点,画一个xy坐标系,x的取值范围:[-50,50],y的取值范围:[-50,50];
由此我们可以得到一个边界,我们要是能够从当前顶点跳到边界,那么就代表逃脱成功了,那么怎么计算呢?
其实就是利用以下几个式子abs(50-x)、abs(50-y)、abs(-50-x)、abs(-50-y)(这就是当前顶点到4条边界的距离)。将这几个值和上文提到的D进行比较,如果值小于等于D,那么就能成功逃脱啦!

⑤其他注意事项
把湖心作为顶点后,记得在创建数组时,数组的大小要在题目的输入N的基础上加1

代码展示

#include <cmath>
#include <cstdlib>
#include <iostream>
#define MAXSIZE 100
#define r 7.5

typedef int pos;
int D;
int check[MAXSIZE + 1] = { 0 };	//检查节点是否被访问过
int res = 0;
/* 顶点 */
struct vertex
{
	pos x, y;
};

/* 边 */
struct ENode
{
	vertex V1, V2;
};
typedef ENode* ptrToENode;
typedef ptrToENode Edge;

/* 邻接表的链表节点 */
struct AdjNode
{
	vertex AdjV;	/* 邻接点位置 */
	AdjNode* next;
};
typedef AdjNode* ptrToAdjNode;


/* 邻接表的表头数组 */
typedef struct VNode
{
	ptrToAdjNode FirstEdge;
	vertex _POS;
}AdjList[MAXSIZE + 1];

/* 图的定义 */
struct GNode
{
	int Nv;	/* 顶点数 */
	int Ne;	/* 边数 */
	AdjList G;	//邻接表
};
typedef GNode* ptrToGNode;
typedef ptrToGNode LGraph;

/* 创建并初始化一个图 */
LGraph creatGraph(int Nv)
{	
	vertex V;
	LGraph graph = (LGraph)malloc(sizeof(GNode));
	graph->Nv = Nv;
	graph->Ne = 0;
	graph->G[0]._POS = { 0 , 0 };
	graph->G[0].FirstEdge = NULL;
	for (int i = 1; i < graph->Nv; i++)
	{	
		std::cin >> V.x >> V.y;		//将鳄鱼位置保存在表头数组中
		graph->G[i]._POS = V;
		graph->G[i].FirstEdge = NULL;
	}
	return graph;
}
/* 查找V在表头数组中的下标 */
int findIndex(LGraph Graph, vertex V)
{
	for (int i = 0; i < Graph->Nv; i++)
	{
		if (Graph->G[i]._POS.x == V.x && Graph->G[i]._POS.y == V.y)
			return i;
	}
}
/* 向图中插入一条边 */
void insertEdge(LGraph Graph, Edge E)
{
	vertex V = E->V1;
	vertex W = E->V2;
	int i = findIndex(Graph, V);
	/* 为W建立新的邻接点空间,并将其插到V的表头 */
	ptrToAdjNode newNode = (ptrToAdjNode)malloc(sizeof(AdjNode));
	newNode->AdjV = W;
	newNode->next = Graph->G[i].FirstEdge;
	Graph->G[i].FirstEdge = newNode;
	Graph->Ne++;
}
/* 检查当前节点能否逃脱 */
bool checkOut(vertex V)
{
	if (abs(-50 - V.x) <= D) return true;
	else if (abs(-50 - V.y) <= D) return true;
	else if (abs(50 - V.x) <= D) return true;
	else if (abs(50 - V.y) <= D) return true;
	else return false;
}



LGraph buildGraph(int N)
{	
	/* 创建图并初始化顶点 */
	LGraph Graph = creatGraph(N);
	vertex V, W;
	/* 建立边 */
	//遍历所有边,在遍历过程中,检查是否有能够建立连接的边
	for (int i = 0; i < Graph->Nv; i++)
	{	
		V = Graph->G[i]._POS;
		for (int j = 0; j < Graph->Nv; j++)
		{	
			W = Graph->G[j]._POS;

			if (i == j) continue;
			else if (i == 0 && j != 0)
			{
				//鳄鱼所在的顶点W到中心岛中心的距离 - 中心岛半径r <= james跳跃距离,则建立边
				double d = sqrt(pow(V.x - W.x, 2) + pow(V.y - W.y, 2)) - r;
				if (d <= D)
				{
					ptrToENode newEdge = (ptrToENode)malloc(sizeof(ENode));
					newEdge->V1 = V;
					newEdge->V2 = W;
					insertEdge(Graph, newEdge);
				}
			}
			else if (j == 0 && i != 0)
			{
				//鳄鱼所在的顶点W到中心岛中心的距离 - 中心岛半径r <= james跳跃距离,则建立边
				double d = sqrt(pow(V.x - W.x, 2) + pow(V.y - W.y, 2)) - r;
				if (d <= D)
				{
					ptrToENode newEdge = (ptrToENode)malloc(sizeof(ENode));
					newEdge->V1 = V;
					newEdge->V2 = W;
					insertEdge(Graph, newEdge);
				}
			}
			else
			{
				//两点的距离小于james跳跃距离,则建立边
				double d = sqrt(pow(V.x - W.x, 2) + pow(V.y - W.y, 2));
				if (d <= D)
				{
					ptrToENode newEdge = (ptrToENode)malloc(sizeof(ENode));
					newEdge->V1 = V;
					newEdge->V2 = W;
					insertEdge(Graph, newEdge);
				}
			}
		}
	}
	return Graph;
}

int visit[MAXSIZE + 1] = { 0 };
void DFS(LGraph Graph, vertex V)
{	
	ptrToAdjNode W;
	/* 检查当前顶点是否被访问过 */
	int i = findIndex(Graph, V);
	if (visit[i] != 0) return;
	visit[i] = 1;

	/* 检查当前顶点能否使james上岸 */
	if (checkOut(V))
	{
		res = 1;	//存储结果的变量	1:表示成功逃脱
		return;
	}
	/* 访问V的所有邻接点 */
	for (W = Graph->G[i].FirstEdge; W != NULL; W = W->next)
	{	
		i = findIndex(Graph, W->AdjV);
		if (visit[i] != 1)
			DFS(Graph, W->AdjV);
	}
}

int main()
{
	int N;
	std::cin >> N >> D;
	LGraph Graph = buildGraph(N + 1);
	DFS(Graph, Graph->G[0]._POS);
	if (res)
		std::cout << "Yes";
	else
		std::cout << "No";
	return 0;
}

心路历程

不看教程做题效率好低啊~~~~~~
一天做了一道,又是被自己菜哭的一天

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/652094.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

gpt-4o继续迭代考场安排程序 一键生成考场清单

接上两篇gpt-4o考场安排-CSDN博客&#xff0c;考场分层次安排&#xff0c;最终exe版-CSDN博客 当然你也可以只看这一篇。 今天又添加了以下功能&#xff0c;程序见后。 1、自动分页&#xff0c;每个考场打印一页 2、添加了打印试场单页眉 3、添加了页脚 第X页&#xff0c;…

Springboot项目——网页版本五子棋

网页五子棋&#xff1a;本项目简单实现了网页版本的五子棋对战功能&#xff0c;同时会根据用户的天梯分数来匹配&#xff0c;可供多位用户同时提供对战功能。大致可分为三个模块&#xff0c;用户模块&#xff0c;匹配模块&#xff0c;对战模块&#xff0c;下面重点介绍以下三个…

班翠鸟优化算法(PKO)-2024年SCI新算法-公式原理详解与性能测评 Matlab代码免费获取

​ 声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原理简介 一、初始化阶段 二、栖…

C# 字节数组(byte[])拼接的性能对比测试

将C#中的三种字节数组拼接方式的性能做了一个对比测试&#xff0c;DEMO程序代码如下&#xff1a; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Byte数组拼接测…

typora自动生成标题序号(修改V1.0)

目录 带序号效果图 解决方法 带序号效果图 解决方法 1.进入文件夹&#xff1a;文件–>偏好设置–>外观–>主题–>打开主题文件夹 2.如果没有base.user.css文件&#xff0c;新建一个。如果有直接用记事本打开&#xff0c;把下面代码拷贝进去保存。 /** initiali…

免税商品优选购物商城,基于 SpringBoot+Vue+MySQL 开发的前后端分离的免税商品优选购物商城设计实现

目录 一. 前言 二. 功能模块 2.1. 登录界面 2.2. 管理员功能模块 2.3. 商家功能模块 2.4. 用户前台功能模块 2.5. 用户后台功能模块 三. 部分代码实现 四. 源码下载 一. 前言 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过…

前端开发之xlsx-js-style的使用和实例

xlsx-js-style的使用和实例 前言效果图安装xlsx-js-style插件导入插件在创建ws后设置表头 前言 在使用xlsx组件的时候如果需要调整xlsx表的样式可以使用xlsx-js-style来进行设置 效果图 安装xlsx-js-style插件 npm install xlsx-js-style导入插件 该文件参考在xlsx的使用中…

各种情况下的线缆大小选择

开口线鼻子和导线对应大小 开口铜鼻子对应线径大小 变压器容量对应高压侧电流大小 开关电流线缆功率对照表 家庭/工业最常用电线铜线电流承载功率 电工常用名词对应符号 导线面积承载的安全载流量及允许负荷对照表 漏电保护器选择参考表 电动机功率换算电流 电机功…

数据(整型和浮点数)在内存中的存储

目录 1.整型在内存中的存储 大小端字节序存储和字节序判断 1.大小端字节序存储&#xff1a; 2.字节序判断&#xff1a; 2.浮点数在内存中的存储 浮点数存储的过程 浮点数读取的过程 题目解析 1.整型在内存中的存储 我们先要明白&#xff1a; 整数在内存中是以二进制形式…

数据结构(六)队列

文章目录 一、概念二、逻辑结构&#xff1a;线性结构三、存储结构&#xff08;一&#xff09;顺序队列&#xff08;二&#xff09;循环队列1. 结构体定义2. 创建队列&#xff08;1&#xff09;函数定义&#xff08;2&#xff09;注意点&#xff08;3&#xff09;代码实现 3. 入…

SQLI-labs-第二十五关和第二十五a关

目录 第二十五关 1、判断注入点 2、判断数据库 3、判断表名 4、判断字段名 5、获取数据库的数据 第二十五a关 1、判断注入点 2、判断数据库 第二十五关 知识点&#xff1a;绕过and、or过滤 思路&#xff1a; 通过分析源码和页面&#xff0c;我们可以知道对and和or 进…

解决 WooCommerce 的分析报表失效问题

今天明月的一个境外电商客户反应网站的 WooCommerce 分析报表已经十多天没有更新了&#xff0c;明明每天都有订单交易可分析报表里的数据依旧是十多天前的&#xff0c;好像更新完全停滞了似的。明月也及时的查看了后台的所有设置&#xff0c;确认没有任何问题&#xff0c;WooCo…

什么是光栅化?

一、 什么是光栅化? 光栅化作用是将几何数据变换后转换为像素呈现在显示设备上的一个过程。几何数据转换为像素&#xff0c; 本质是坐标变换、几何离散化&#xff0c;如下&#xff1a; 其中包含了坐标变换和几何离散化&#xff1a; 二、光栅化完成了什么 3D中&#xff0c;物…

数组-两个升序数组中位数

一、题目描述 二、解题思路 (一).基本思想&#xff1a; 如果列表总长度allsize( arr1.size()arr2.size() ) 为奇数时&#xff0c;中位数位置应该在两个列表排序后的第 allsize/2 位置处&#xff0c;如果allsize为偶数&#xff0c;中位数应该取 (allsize/2)-1 和 allsize/2 的…

Google Extension 【Google 最佳扩展插件】

pockettube: youtube manager 订阅号分组沉浸式翻译&#xff1a;全网口碑炸裂的双语对照网页翻译插件Google 翻译腾讯翻译篡改猴MetaMaskGlarity: Summarize & Translate Any Page

移动端应用订阅SDK接入攻略

本文档介绍了联想应用联运移动端订阅SDK接入操作指南&#xff0c;您可在了解文档内容后&#xff0c;自行接入应用联运移动端订阅SDK。 接入前准备 1请先与联想商务达成合作意向。 2.联系联想运营&#xff0c;提供应用和公司信息&#xff0c;并获取商户id、app id、key&#…

卸载/删除 Maxask.com,最简单的方法

被绑架的浏览器&#xff0c;太恶心了。 Maxask伪装成了插件&#xff0c;在你搜索网页的时候利用了重定向&#xff0c;导致出现的界面时Maxask的界面&#xff0c;很恶心。 只需要排查正在使用的&#xff0c;如下图有颜色的图表。 删除一个插件&#xff0c;浏览器搜索一下看看有…

2024年上半年软件设计师试题及答案(回忆版)--选择题

基础知识选择题 基础知识选择题 1,2,3][4,5,6][1,2,3,4,5,6] &#xff08;总&#xff1a;1分&#xff09; &#xff08;注意&#xff1a;括号内的是截止当前题目总分&#xff09; vlan不能隔绝内外网 &#xff08;2分&#xff09; 链路层使用交换机&#xff0c;…

C语言 | Leetcode C语言题解之第115题不同的子序列

题目&#xff1a; 题解&#xff1a; int numDistinct(char* s, char* t) {int m strlen(s), n strlen(t);if (m < n) {return 0;}unsigned long long dp[m 1][n 1];memset(dp, 0, sizeof(dp));for (int i 0; i < m; i) {dp[i][n] 1;}for (int i m - 1; i > 0;…

M2m中的采样

采样的完整代码 import torch import numpy as np from torchvision import datasets, transforms from torch.utils.data import DataLoader, WeightedRandomSampler, SubsetRandomSamplerdef get_oversampled_data(dataset, num_sample_per_class):""" Gener…