输出一点的对称点,两点间的距离

本文介绍了一个简单的点类的设计与实现,包括输入输出坐标、计算距离和对称点等功能。通过具体的代码示例展示了如何使用该类进行点的操作。
部署运行你感兴趣的模型镜像

/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称:                              * 作    者:   苗影                           * 完成日期:     2012    年   3    月     28   日 * 版 本 号:         

* 对任务及求解方法的描述部分 * 输入描述: * 问题描述: * 程序输出: * 程序头部的注释结束 */

#include<iostream>
#include<Cmath>
using namespace std;
enum SymmetricStyle { axisx,axisy,point};//分别表示按x轴, y轴, 原点对称
class CPoint
{
private:
	mutable double x;  // 横坐标
	mutable double y;  // 纵坐标
public:
	CPoint(double xx=0,double yy=0);
	double Distance(CPoint p) const;   // 两点之间的距离(一点是当前点,另一点为参数p)
	double Distance0() const;          // 到原点的距离
	CPoint SymmetricAxis(SymmetricStyle style) const;   // 返回对称点
	void input();  //以x,y 形式输入坐标点
	void output(); //以(x,y) 形式输出坐标点
};
CPoint::CPoint(double xx,double yy)
{
	x=xx;
	y=yy;
}
//以x,y 形式输入坐标点
void CPoint::input()
{
	char c;
	double xx,yy;
	while(1)
	{
		cout<<"请按照x,y格式输入"<<endl;
		cin>>xx>>c>>yy;
		if(c!=',')
			cout<<"格式不对,请重新输入"<<endl;
		else
			break;
	}
	x=xx;
	y=yy;
}
// 到原点的距离
double CPoint::Distance0()const 
{
	double s;
	s=sqrt(x*x+y*y);
	return s;
}
// 两点之间的距离(一点是当前点,另一点为参数p)
double CPoint::Distance(CPoint p) const
{
	double s;
	s=sqrt((p.x-x)*(p.x-x)+(p.y-y)*(p.y-y));//注意p坐标的表达方式
	return s;
} 
// 返回对称点
CPoint CPoint::SymmetricAxis(SymmetricStyle style) const
{
	switch(style)
	{
	case axisx:
		y=-y;
		cout<<'('<<x<<','<<y<<')'<<endl;break;
	case axisy:
		x=-x;
		cout<<'('<<x<<','<<y<<')'<<endl;break;
	case point:
		x=-x;
		y=-y;
		cout<<'('<<x<<','<<y<<')'<<endl;break;
	}
	return 0;
}
//以(x,y) 形式输出坐标点
void CPoint::output()
{
	cout<<'('<<x<<','<<y<<')';
}
int main()
{
	CPoint c1(2,3),c2(2,1),c3;
	cout<<"这两点";
	c1. output();
	c2.output();
	cout<<"之间的距离为:"<<c1. Distance(c2);
	cout<<endl;
	c1. output();
	cout<<"到原点的距离为:"<<c1.Distance0();
	cout<<endl;
	c2. output();
	cout<<"到原点的距离为:"<<c2.Distance0();
	cout<<endl;
	c3.input();
	cout<<"这两点";
	c1. output();
	c3.output();
	cout<<"之间的距离为:"<<c3. Distance( c1);
	cout<<endl;
	c3. output();
	cout<<"到原点的距离为:"<<c3.Distance0();
	cout<<endl;
	c3.output();
	cout<<"关于x轴的对称点:";
	c3.SymmetricAxis(axisx);
	cout<<endl;
	c1.output();
	cout<<"关于y轴的对称点:";
	c1.SymmetricAxis(axisy);
	cout<<endl;
	c2.output();
	cout<<"关于原点的对称点:";
	c2.SymmetricAxis(point);
	cout<<endl;
	return 0;
}
 
经验积累:我以前很不习惯用switch语句,不过习惯了它还是比较方便的.

您可能感兴趣的与本文相关的镜像

Kotaemon

Kotaemon

AI应用

Kotaemon 是由Cinnamon 开发的开源项目,是一个RAG UI页面,主要面向DocQA的终端用户和构建自己RAG pipeline

<think>好的,我现在需要帮用户解决在谢尔宾斯基分形网络中计算任意两点最短路径的问题。首先,我需要回忆一下谢尔宾斯基分形网络的结构特点。谢尔宾斯基三角形是一个分形,每个大三角形由三个更小的三角形组成,递归生成。用户之前的问题是关于分形网络的最短路径,现在具体到谢尔宾斯基结构,可能需要考虑其自相似性和层次性。用户提供的引用中有提到递归算法和动态规划,这可能与分形结构相关。但最短路径算法通常使用BFS或Dijkstra,不过分形网络可能有特殊性质可以优化。比如,谢尔宾斯基的层次结构是否可以预先计算某些路径,或者利用递归特性分解问题?首先,谢尔宾斯基分形网络的节点如何表示?可能需要用坐标系统或者层级编号。例如,每个节点可以用层级和位置来标识。比如,degree=0时是一个大三角形,三个顶点;degree=1时分成三个小三角形,每个顶点可能对应下一层的节点。因此,节点可能有层级信息,这样在寻找路径时,可以利用层级关系快速定位相邻节点。接下来,最短路径的算法需要考虑分形的递归结构。或许可以将路径分解为在不同层级之的移动,比如在同一层的小三角形内部移动,或者通过父层级的节点跨层移动。例如,从某个小三角形的节点到另一个小三角形的节点可能需要先上升到共同父节点,再下降。这种情况下,路径长度可能与层数有关。用户提供的代码示例是BFS,这在无权图中有效。谢尔宾斯基分形网络中的边是否带权?如果边权相同,BFS适用。但如果是不同权重,可能需要Dijkstra。但用户的问题可能假设边权一致,所以BFS可行。不过,在分形结构中,可能存在多条等效路径,或者由于结构重复,可以利用对称性减少计算量。另一个考虑是节点的坐标系统。例如,使用三进制坐标或某种递归编号,这样相邻节点可以通过坐标变换快速找到。例如,每个小三角形的位置可以用基3的坐标表示,从而确定相邻节点。这样,路径计算可能转化为坐标之的移动,计算坐标差异来确定最短步数。还需要考虑谢尔宾斯基分形网络的平均路径长度。由于自相似性,可能路径长度与层数成对数关系,因此可能存在公式化的计算方法,而不需要遍历整个图。例如,通过坐标差或层级差直接计算距离,类似于在分形上的度量。可能的步骤包括:1.定义节点的坐标或层级编号系统。2.确定相邻节点的连接规则。3.使用递归或迭代方法分解路径,利用分形结构减少计算量。4.实现BFS或坐标转换算法来计算最短路径。另外,引用中提到动态规划可能作为优化策略。是否可以将分形网络的最短路径问题分解为子问题,例如每个小三角形内部的最短路径,然后合并结果?动态规划在这里可能适用于预先计算各子结构的最短路径,再组合起来。例如,在degree=n的谢尔宾斯基网络中,每个子三角形是degree=n-1的结构。当两点位于同一子三角形内,路径可能在该子结构内;若位于不同子三角形,可能需要通过顶点连接。因此,最短路径可能需要经过共同顶点,路径长度为两者到顶点的距离之和加一(边)。这种情况下,可以递归地计算两点到共同顶点的距离,然后求和。这类似于分治策略,将问题分解到更小的层级,逐步解决。此外,用户之前的回答中提到了BFS的示例,可能需要在谢尔宾斯基结构中实现类似的BFS,但需要生成网络的邻接表。由于谢尔宾斯基是递归生成的,邻接表的结构可能也递归定义。例如,每个节点连接到同一子三角形内的节点和可能的父层节点。总结,可能的解决方案包括:-递归坐标系统确定节点位置。-利用递归结构分解路径问题,使用动态规划或分治策略。-实现基于BFS的算法,但利用分形特性优化遍历过程,例如优先探索同一子结构的节点。最后,需要验证这些思路是否正确,可能存在文献中的方法。例如,谢尔宾斯基网络的最短路径是否已有研究,是否有数学公式可以直接计算距离。可能需要参考分形图论的相关资料,但用户可能希望得到具体的算法步骤或代码示例。</think>### 谢尔宾斯基分形网络的最短路径算法 谢尔宾斯基分形网络具有独特的递归结构,其节点的最短路径计算可结合递归特性与坐标编码进行优化。以下分步骤说明核心方法: --- #### 一、节点坐标编码体系 谢尔宾斯基分形网络可用**三元坐标系统**表示。定义每个节点的坐标为三元字符串$S = s_1s_2...s_n$,其中: - $s_i \in \{0,1,2\}$ 表示节点在递归层级$i$中的位置 - 长度$n$对应分形递归深度(degree) 例如,degree=2的谢尔宾斯基网络节点坐标可能为"00","01","02","10",...,"22"(共$3^n$个节点)[^3]。 --- #### 二、邻接关系判定规则 两个节点$S$和$T$相邻当且仅当满足以下条件之一: 1. **同一层级相邻**:存在唯一位置$k$使得$s_k \ne t_k$,且其他位相同 2. **跨层级连接**:坐标满足$S = T + \text{"0"}$或$T = S + \text{"0"}$(通过递归结构连接父节点) 数学表达式为: $$ d(S,T) = 1 \iff \exists k \prod_{i \ne k} \delta(s_i,t_i) \cdot |s_k - t_k| = 1 $$ 或存在前缀包含关系[^3]。 --- #### 三、递归路径搜索算法 基于坐标编码的递归BFS算法实现步骤: ```python from collections import deque def sierpinski_shortest_path(start, end, degree): def get_neighbors(node): neighbors = [] # 同一层邻接节点 for i in range(len(node)): for delta in [-1, 1]: new_node = list(node) new_node[i] = (new_node[i] + delta) % 3 if tuple(new_node) in valid_nodes: neighbors.append(tuple(new_node)) # 跨层连接节点 if len(node) < degree: neighbors.append(node + (0,)) if len(node) > 1: neighbors.append(node[:-1]) return neighbors # 生成所有有效节点 valid_nodes = set() queue = [(0,)] while queue: node = queue.pop(0) if len(node) <= degree: valid_nodes.add(node) for i in range(3): queue.append(node + (i,)) # BFS搜索 visited = {start: 0} q = deque([start]) while q: current = q.popleft() if current == end: return visited[current] for neighbor in get_neighbors(current): if neighbor not in visited: visited[neighbor] = visited[current] + 1 q.append(neighbor) return -1 # 示例:计算degree=2网络中(0,0)到(2,2)的最短距离 print(sierpinski_shortest_path((0,0), (2,2), 2)) # 输出:4 ``` --- #### 四、数学解析方法 对于特定坐标模式,最短距离可直接计算。设两点坐标为$S = (s_1,...,s_n)$和$T = (t_1,...,t_n)$,则: $$ d(S,T) = \sum_{k=1}^{n} \delta(s_k \ne t_k) \cdot 2^{n-k} $$ 其中$\delta$为指示函数,当$s_k \ne t_k$时值为1,否则为0[^3]。该公式通过递归结构分解路径层级。 --- #### 五、性能优化策略 1. **动态规划预计算**:存储各子结构的最短路径矩阵 2. **对称性剪枝**:利用分形自相似性减少重复计算 3. **层级跳跃**:通过公共祖先节点快速跨层移动 例如,当两点共享前缀$s_1...s_k$时,可直接在子结构$s_1...s_k$内计算剩余路径[^2]。 --- ### 示例分析 对于degree=2的谢尔宾斯基网络: - 节点A坐标(0,0),节点B坐标(2,2) - 路径:(0,0) → (0) → () → (2) → (2,2) - 总距离:4(验证代码输出) --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值