蓝桥杯省赛真题打卡day4

news2024/10/6 18:29:59

[蓝桥杯 2013 省 A] 大臣的旅费

题目描述

很久以前,T 王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。

为节省经费,T 国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。

J 是 T 国重要大臣,他巡查于各大城市之间,体察民情。所以,从一个城市马不停蹄地到另一个城市成了 J 最常做的事情。他有一个钱袋,用于存放往来城市间的路费。

聪明的 J 发现,如果不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关,在走第 x−1 千米到第 x 千米这一千米中(x 是整数),他花费的路费是 x+10 这么多。也就是说走 1 千米花费 11,走 2 千米要花费 23。

J 大臣想知道:他从某一个城市出发,中间不休息,到达另一个城市,所有可能花费的路费中最多是多少呢?

输入格式

输入的第一行包含一个整数 n(n≤10^5),表示包括首都在内的 T 王国的城市数。

城市从 1 开始依次编号,1 号城市为首都。

接下来 n−1 行,描述 T 国的高速路(TT 国的高速路一定是 n−1 条)。

每行三个整数 Pi,Q,Di,表示城市 Pi 和城市 Qi 之间有一条高速路,长度为 Di(Di≤1000) 千米。

输出格式

输出一个整数,表示大臣J最多花费的路费是多少。

输入输出样例

输入 #1复制

5
1 2 2
1 3 1
2 4 5
2 5 4

输出 #1复制

135

说明/提示

样例解释:大臣 J 从城市 4 到城市 5 要花费 135 的路费。

时限 5 秒, 64M。蓝桥杯 2013 年第四届省赛

附:树的直径的定义

在一棵树中,每一条边都有权值,树中的两个点之间的距离,定义为连接两点的路径上边权之和,那么树上最远的两个点,他们之间的距离,就被称之为,树的直径。

树的直径的别称,树的最长链。

请注意:树的直径,还可以认为是一条路径,不一定是只是一个数值。

考察算法:图论---无向无环带权图,树的直径,dfs,bfs,邻接表,树形dp

思路:题目中说,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的,说明是无环图,城市与城市直接有距离,说明是带权的,又任一两个城市都可以到达,所以是无向的,所以可以将这个图转化为,题目让我们求花费路费最多是多少,而路费又与城市间距离有关,所以就转化为了求任意两点间距离的最大值,也就是求树的直径.先想一种暴力做法,枚举任意一个起点,再枚举除起点以外的任意一个点作为终点,求两点间的距离,取最大值.在一棵树中或一个图中求任意两点的距离,可以用dfs.处理输入时,可以采用邻接表(方便查找任意一个点的邻居)存储.优化:以首都为根,且树的直径一定经过根,将根结点一分为二,比如从根结点走到右边某个叶子结点一定是半径最长的,再以该叶子结点为根,走到左边某个叶子结点一定是直径最长的,所以该题可以用两次dfs,第一次dfs以编号为1的城市(首都)为起点,且起点固定的情况下,执行一次dfs可以遍历所有的点,以1为起点找到路径最长的终点,再以该终点为根结点,再次dfs.

两次dfs/bfs:

优点 : 可以通过一个新的数组记录路径信息(例如父节点与子节点之间的关系) 缺点 : 无法处理 负边权 .

实现过程 : 1、从任意一个节点出发,通过 BFS 或 DFS 对树进行一次遍历,求出与出发点距离最远的节点,记为 p。 2、从节点 p 出发,通过 BFS 或 DFS 再进行一次遍历,求出与 p 距离最远的节点,记为 q。 (p 是一个节点的最远的一个端点,那么从 p 出发的最远的端点就是直径的另一个端点) 为什么无法处理负边权?

 看上面这个图: 如果按照 DFS 或者 BFS 我们第一次 找到的最远距离的节点是 2 , 然后从 2 出发
到达的最远距离的节点是 1 ,所以得到的树的直径长度是 1 ,但我们从图中很容易看出来树的直径最长应该是 2.(用树形 DP 的话从下向上就可以得到最长的树的直径的长度)

#include<bits/stdc++.h>
#define x first
#define y second
#define endl '\n'
using namespace std;
const int N=1e5+5,INF=0x3f3f3f3f,mod=1e9+7,M=2*N;
typedef pair<int,int>PII;
typedef long long LL;
using namespace std;
int head[N * 2],edge[N * 2],Next[N * 2],ver[N * 2];
int vis[N],dist[N];
int n,p,q,d;
int tot = 0;
int maxd = 0;
int main() {
    ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int BFS(int u);
    void add(int u,int v,int w);
	scanf("%d",&n);
	for(int i = 1; i < n; i ++) {
		scanf("%d%d%d",&p,&q,&d);
		add(p,q,d);                   //建立无向图
		add(q,p,d);
	}
	int u = BFS(1);
	int s = BFS(u);
	printf("第一次遍历得到的节点 : %d\n",u);
	printf("第二次遍历得到的节点 : %d\n",s); 
	return 0;
}
void add(int u,int v,int w) {
	ver[ ++ tot] = v,edge[tot] = w;
	Next[tot] = head[u],head[u] = tot;
	return ;
}
int BFS(int u) {
	queue<int>Q;
	while(!Q.empty()) Q.pop();
	memset(vis,0,sizeof(vis));            //每次遍历的时候记得对数组进行Clear
	memset(dist,0,sizeof(dist));  
	Q.push(u);
	int x,max_num = 0;
	while(!Q.empty()) {
		x = Q.front();
		Q.pop();
		vis[x] = 1;
		for(int i = head[x]; i ; i = Next[i]) {
			int y = ver[i];
			if(vis[y]) continue;
			vis[y] = 1;
			dist[y] = dist[x] + edge[i];//从上向下走,所以需要进行累加(这是与树形DP最大的不同)
			if(dist[y] > maxd ) {     //更新值和节点编号
				maxd = dist[y];
				max_num = y;
			}
			Q.push(y);   //每个新的节点都要加入到队列中,有可能与该节点相连的路径是比较长的
		}
	}
	return max_num;
}
#include<bits/stdc++.h>
#define x first
#define y second
#define endl '\n'
using namespace std;
const int N=1e5+5,INF=0x3f3f3f3f,mod=1e9+7,M=2*N;
typedef pair<int,int>PII;
typedef long long LL;
using namespace std;
vector<PII> G[N];        // 用 pair<int,int>来保存部分信息,相对于 结构体来说更加方便一点
int dist[N];
int n,p,q,d;
int main() {
    ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	void solve();
	scanf("%d",&n);
	for(int i = 1; i < n; i ++) {
		scanf("%d%d%d",&p,&q,&d);
		G[p].push_back(make_pair(q,d));
		G[q].push_back(make_pair(p,d));
	}
	solve();
	return 0;
}
void DFS(int u,int father,int value) {
	dist[u] = value;                               // 这种方式就不用进行对数组Clear了
	for(int i = 0; i < G[u].size(); i ++) {
		if(G[u][i].x != father) {
			DFS(G[u][i].x,u,value + G[u][i].y);
		}
	}
	return ;
}
void solve() {
	DFS(1,-1,0);
	int u = 1;
	for(int i = 1; i <= n; i ++) {                    // 遍历寻找最大值
		if(dist[i] > dist[u]) {
			u = i;
		}
	}
	int x = u;
	DFS(u,-1,0);                                      // 第二次进行找另一个端点
	for(int i = 1; i <= n; i ++) {
		if(dist[i] > dist[u]) {
			u = i;
		}
	}
	int s = u;
	printf("第一次遍历得到的最远的节点编号 : %d\n",x);
	printf("第二次遍历得到的最远的节点编号 : %d\n",s);
	return ;
}

第二种方法可以用树形dp.

优点 : 可以有效处理 负边权 缺点 : 对于记录路径的信息效率较低

简单分析 : 先通过递归的方式到叶子底部,然后通过自底向上的方式进行更新距离,找到最长路径。 (看下图,可以得到这棵树的直径是经过根节点 1 的 路径最长的链 5 -> 2 -> 1 和 经过根节点 1 的路径 次长链 3 -> 6 -> 1 两者之和 由此可得:树的直径 = (经过某个节点的) 最长链 + 次长链) -- 是路径长度

实现过程:设 D[x] 表示从节点 x 出发走向以 x 为根的子树,能够到达的最远距离。 设 x 的子节点为 y1,y2....yt,edge(x,y)表示边权,显然有: D[x] = max(D[yi] + edge(x,yi))(i 的范围是 1 - t) 也就是说,从 根节点出发,找到自己的最小辈,然后从最小辈向根节点更新,找一个最长的路径链。 只要子节点是最长的,那么我们更新到根节点时,这条链毫无疑问也就是最长的。 我们在找某个节点的最长链会发现一个问题,就是当前节点有有几个子节点,有一个我们没得选,当有多个时我们就需要选择最长的。 拿上面的图来说, 2 号节点有 两个子节点,我们就需要进行比较一下,100 > 2 + 30 ,所以我们应该选择 5 -> 2 这条链。

具体代码:

void dp(int x) {
	 vis[x] = 1;
	 for(int i = head[x]; i ; i = Next[i]) {
		int y = ver[i];
		if(vis[y]) continue;                          // 判断是否已经经过该节点
		dp(y);                                        // 继续向下寻找子节点
		ans = max(ans,dist[x] + dist[y] + edge[i]);   // 枚举从 x 节点出发的所有边,找一个最远的路径(看上面的 2 号节点)(dist[x] 是当前目前已知的最长的,
                                                              // 但是 x 可能有多个分支,所以需要枚举找最长的或者次长的,形成经过该节点的直径)
		dist[x] = max(dist[x],dist[y] + edge[i]);     // 经过枚举后 dist[x] 就不一定是当前最长的的,所以需要更新一下。
	 }

 本题代码:

#include<bits/stdc++.h>
#define x first
#define y second
#define endl '\n'
using namespace std;
const int N=1e5+5,INF=0x3f3f3f3f,mod=1e9+7,M=2*N;
typedef pair<int,int>PII;
typedef long long LL;
struct node{
	int num,cost;//点的编号和到这个点的距离
};
int ans;
void dfs(vector<node>g[],int vis[],int i,int j,int dist){
	//查看如果是直接邻居
	for(int k=0;k<g[i].size();k++){//访问i所有的邻居
		if(g[i][k].num==j){//i的直接邻居中有j
			ans=max(ans,dist+g[i][k].cost);
			return;
		}
	}
	vis[i]=0;
	//如果不是直接邻居,就从现有的直接邻居去连接
	for(int k=0;k<g[i].size();k++){
		if(vis[g[i][k].num]==-1)
			dfs(g,vis,g[i][k].num,j,dist+g[i][k].cost);
	}
	vis[i]=-1;
}
int check(int dist){
	/* 第一项是11,第二项是12,第三项是13....
	第n项是11+(dist-1),所以总和就是(11+11+(dist-1))*dist/2 */
	return (21+dist)*dist/2;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n;
	cin>>n;
	vector<node>g[n+1];
	int vis[n+1];
	memset(vis,-1,sizeof vis);//初始化为-1
	for(int i=1;i<n;i++){
		int a,b,c;
		cin>>a>>b>>c;
		node p1={b,c};
		node p2={a,c};
		g[a].push_back(p1);
		g[b].push_back(p2);
	}
	//暴力求任意两点间距离,并维护最长距离
	for(int i=1;i<=n-1;i++){
		for(int j=i+1;j<=n;j++){
			dfs(g,vis,i,j,0);//i,j表示从i到j的距离
		}
	}
	cout<<check(ans)<<endl;
	return 0;
}
//暴力解法
#include<bits/stdc++.h>
#define x first
#define y second
#define endl '\n'
using namespace std;
const int N=1e5+5,INF=0x3f3f3f3f,mod=1e9+7,M=2*N;
typedef pair<int,int>PII;
typedef long long LL;
struct node{
	int num,cost;//点的编号和到这个点的距离
};
int ans;
int point=-1;
void dfs(vector<node>g[],int vis[],int start,int dist){
	vector<node>nei_start=g[start];//表示start的所有邻居的集合
	vis[start]=0;//表示被访问
	bool isLeaf=true;
	for(int k=0;k<nei_start.size();k++){
		int num=nei_start[k].num;//邻居点的标号
		if(vis[num]==-1){
			isLeaf=false;
			dfs(g,vis,num,dist+nei_start[k].cost);
		}
	}
	vis[start]=-1;
	if(isLeaf){
		if(dist>ans){//更新答案
			ans=dist;
			point=start;
		}
	}
}
int check(int dist){
	/* 第一项是11,第二项是12,第三项是13....
	第n项是11+(dist-1),所以总和就是(11+11+(dist-1))*dist/2 */
	return (21+dist)*dist/2;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n;
	cin>>n;
	vector<node>g[n+1];
	int vis[n+1];
	memset(vis,-1,sizeof vis);//初始化为-1
	for(int i=1;i<n;i++){
		int a,b,c;
		cin>>a>>b>>c;
		node p1={b,c};
		node p2={a,c};
		g[a].push_back(p1);
		g[b].push_back(p2);
	}
	dfs(g,vis,1,0);
	ans=0;//重置答案
	dfs(g,vis,point,0);
	cout<<check(ans)<<endl;
	return 0;
}
//两次dfs优化做法
#include<bits/stdc++.h>
#define x first
#define y second
#define endl '\n'
using namespace std;
const int N=1e5+5,INF=0x3f3f3f3f,mod=1e9+7,M=2*N;
typedef pair<int,int>PII;
typedef long long LL;
int e[M],w[M],ne[M],h[M],idx;
int vis[M],far;//far为最远点
int ans;
int n;
void add(int a,int b,int c){
	e[idx]=b;
	w[idx]=c;
	ne[idx]=h[a];
	h[a]=idx++;
}
void dfs(int a,int val){
	vis[a]=1;
	if(val>ans){
		ans=val;
		far=a;
	}
	for(int i=h[a];i!=-1;i=ne[i]){
		if(!vis[e[i]])
			dfs(e[i],val+w[i]);
	}
}
int check(int dist){
	return (21+dist)*dist/2;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n;
	memset(h,-1,sizeof h);
	for(int i=1;i<n;i++){
		int a,b,c;
		cin>>a>>b>>c;
		add(a,b,c);
		add(b,a,c);
	}
	dfs(1,0);
	memset(vis,0,sizeof vis);
	dfs(far,0);
	cout<<check(ans)<<endl;
	return 0;
}
//两次dfs另一种做法
#include<bits/stdc++.h>
#define x first
#define y second
#define endl '\n'
using namespace std;
const int N=1e5+5,INF=0x3f3f3f3f,mod=1e9+7,M=2*N;
typedef pair<int,int>PII;
typedef long long LL;
int h[N*2],e[N*2],ne[N*2],ver[N*2];
int dist[N],vis[N];
int tot,ans;
int n;
void add(int u,int v,int w){
	ver[++tot]=v;
	e[tot]=w;
	ne[tot]=h[u];
	h[u]=tot;
}
void dp(int x){
	vis[x]=1;
	for(int i=h[x];i;i=ne[i]){
		int y=ver[i];
		if(vis[y]) continue;
		dp(y);
		ans=max(ans,dist[x]+dist[y]+e[i]);
		dist[x]=max(dist[x],dist[y]+e[i]);
	}
}
int check(int dist){
	return (21+dist)*dist/2;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1;i<n;i++){
		int a,b,c;
		cin>>a>>b>>c;
		add(a,b,c);
		add(b,a,c);
	}
	ans=0;
	dp(1);
	cout<<check(ans)<<endl;
	return 0;
}
//树形dp做法

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模电中二极管,三极管和电容的应用

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

使用 Python 遍历文件夹

要解决这个问题&#xff0c;使用 Python 的标准库可以很好地完成。我们要做的是遍历目录树&#xff0c;找到所有的 text 文件&#xff0c;读取内容&#xff0c;处理空行和空格&#xff0c;并将处理后的内容合并到一个新的文件中。 整体思路&#xff1a; 遍历子目录&#xff1…

三维模型点云化工具V1.0使用介绍:将三维模型进行点云化生成

三维软件绘制的三维模型导入之后&#xff0c;可以生成点云&#xff0c;用于替代实际的激光扫描过程&#xff0c;当然&#xff0c;主要是用于点云算法的测试和验证&#xff0c;没法真正模拟扫描的效果&#xff0c;因为太过于理想化了。 功能介绍 将三维软件绘制的三维模型变成…

一个月学会Java 第3天 对类的深刻认识

Day3 对类的深刻认识 第一章 方法 在Day2的时候已经浅浅的认识过类&#xff0c;但是还是不够深刻&#xff0c;我们现在来深刻的认识一下类是什么和他的结构&#xff0c;首先在认识类的结构之前我们需要再认识和了解这么一个东西&#xff0c;他就是——方法 方法(method)也叫函…

iMazing只能苹果电脑吗 Win和Mac上的iMazing功能有区别吗

在当今数字时代&#xff0c;管理和备份手机数据变得越来越重要。无论是转移照片、备份短信&#xff0c;还是管理应用程序&#xff0c;一个强大的工具可以大大简化这些操作。iMazing作为一款备受好评的iOS设备管理软件&#xff0c;已经成为许多用户的选择。但是&#xff0c;许多…

用manim实现Gram-Schmidt正交化过程

在线性代数中&#xff0c;正交基有许多美丽的性质。例如&#xff0c;由正交列向量组成的矩阵(又称正交矩阵)可以通过矩阵的转置很容易地进行反转。此外&#xff0c;例如&#xff1a;在由彼此正交的向量张成的子空间上投影向量也更容易。Gram-Schmidt过程是一个重要的算法&#…

GESP C++三级样题卷

&#xff08;满分&#xff1a;100 分 考试时间&#xff1a;90 分钟&#xff09; 一、单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 1.下列关于负数的原码、反码、补码的描述中&#xff0c;正确的是( ) A 原码和反码互为按位取反&#xff08;符号位除外&…

[ComfyUI]Flux:太强了!任意扩图神器,小红书极致逼真风格出游打卡写实风

随着人工智能技术的不断发展&#xff0c;图像生成与反推技术已经成为了AI领域的一大热点。今天&#xff0c;我们就来为大家详细介绍一款由ComfyUI团队开发的超强图像反推工具——Flux&#xff0c;以及如何使用它实现任意扩图和极致逼真风格出游打卡写实风。 一、Flux&#xff…

k8s-集群部署1

k8s-集群部署1 一、基础环境准备二、docker环境准备三、k8s集群部署1.kubeadm创建集群2.使用kubeadm引导集群 总结 一、基础环境准备 首先&#xff0c;需要准备三个服务器实例&#xff0c;这里我使用了阿里云创建了三个实例&#xff0c;如果不想花钱&#xff0c;也可以在VM上创…

第十一章 缓存之更新/穿透/雪崩/击穿

目录 一、什么是缓存 二、缓存更新策略 2.1. 缓存主动更新策略 2.1.1. Cache Aside模式&#xff08;主流&#xff09;‌ 2.1.2. Read/Write Through模式‌ 2.1‌.3. Write Behind模式‌ 2.1.4. 总结 三、缓存穿透 四、缓存雪崩 五、缓存击穿 5.1. 互斥锁实现 5.1.1…

好用且不伤眼镜的超声波清洗机排名!谁才是清洁小能手?

对于经常佩戴眼镜的人来说&#xff0c;眼镜的日常清洁保养极为关键。传统清洁方式可能导致镜片刮花和残留污渍&#xff0c;鉴于此&#xff0c;眼镜专用的超声波清洗机应运而生&#xff0c;利用超声振动技术深入微细缝隙&#xff0c;彻底扫除污垢与油脂&#xff0c;保护镜片免受…

计算机编程入门先学什么最好?零基础入门到精通,收藏这篇就够了

看完其他知友的回答&#xff0c;我认为他们的观点过于局限&#xff0c;并没有真正切中问题的要害。 我们不妨换个角度&#xff0c;站在更高一层来看这个问题「计算机编程入门先学什么最好&#xff1f;」 计算机入门最应该学的是 Linux&#xff0c;而非任何的编程语言。 这篇文…

A_H_README_TO_RECOVER勒索恢复---惜分飞

有客户mysql数据库被黑(业务数据库被删除)&#xff0c;创建了一个A_H_README_TO_RECOVER库 [rootwww.xifenfei.com ~]# mysql -uroot -pxxxxx Warning: Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; …

站岗放哨树形dp

前言&#xff1a;好久没有写树上dp了&#xff0c;这儿题目还是挺有意思的 题目地址 #include<bits/stdc.h> #include<iostream> using namespace std;//#define int long long int n; const int N (int)1e510; int e[N],ne[N],h[N],idx 0; int dp[2][N];void add…

【笔记】神领物流Day1.1.20权限管家

传智权限管家是一个通用的权限管理中台服务&#xff0c;在神领物流项目中&#xff0c;我们使用权限系统管理企业内部员工&#xff0c;比如&#xff1a;快递员、司机、管理员等。 在权限管家中可以管理用户&#xff0c;管理后台系统的菜单&#xff0c;以及角色的管理。 权限管家…

【百度文心智能体】想开发爆款智能体?来看看 万圣节之夜探秘者 智能体开发流程大揭秘

目录 前言 一. 创作灵感 二. 智能体中Prompt如何设计 2.1 头像 && 聊天背景 2.2 智能体简介 && 角色定位与目标 2.3 思考路径 && 个性化 2.4 开场白 && 自动追问 2.5 插件选择 三. 总结 前言 从2022年11月底ChatGPT …

JavaEE: 数据链路层的奇妙世界

文章目录 数据链路层以太网源地址和目的地址 类型数据认识 MTU 数据链路层 以太网 以太网的帧格式如下所示: 源地址和目的地址 源地址和目的地址是指网卡的硬件地址(也叫MAC地址). mac 地址和 IP 地址的区别: mac 地址使用6个字节表示,IP 地址4个字节表示. 一般一个网卡,在…

论文选题没思路?用这7个GPT提示词10分钟确定论文选题

选题是论文写作的第一步&#xff0c;也是至关重要的一步。毕业论文选题都是让大学生头疼的大事。没有灵感、方向不清、信息太多&#xff0c;常常让人无从下手。现在有了ChatGPT这样的AI写作辅助工具&#xff0c;它可以帮你快速生成丰富的选题思路&#xff0c;轻松解决选题难题。…

Anaconda创建环境

目录 前言 第一步&#xff1a;更改环境创建位置 第二步&#xff1a;安装环境 前言 在我们创建多个项目的时候&#xff0c;有时会安装的库版本冲突&#xff0c;所以最好是一个项目一个环境 第一步&#xff1a;更改环境创建位置 新安装Anaconda后&#xff0c;在创建环境时环…

洛谷每日一题(P1205 [USACO1.2] 方块转换 Transformations)矩阵变换

原题目链接&#xff1a; P1205 [USACO1.2] 方块转换 Transformations - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 原题目截图&#xff1a; 思路分析&#xff1a; 这题目还是比较简单&#xff0c;模拟一下旋转变化的过程&#xff0c;然后注意变换的规律就行了。 读取输入…