ARC153B Grid Rotations 题解

B - Grid Rotations (atcoder.jp)

SOLUTION

我表示大为不理解。。。。这个简单🍳题把我坑🕳惨了

首先我们可以知道每一行/列的数不会发生错位(证明显然)

通过样例观察法,我们可以发现:

最终每一行/列的数是原来正序/倒序的循环

证明:

以一维数组为例:

1 2 3 | 4 5 6 7

→ \to 3 2 1 | 7 6 5 4

3 2 1 7 | 6 5 4

→ \to 7 1 2 3 | 4 5 6

因为每一次进行翻转操作

最边边的两个数会挨在一起ヽ( ̄ω ̄( ̄ω ̄〃)ゝ

而且他们原本在P上就是挨在一起的

因为最边边的要么是原本的开头和结尾

要么就是从中间剖开的

(这两种情况在P上都是)

剩下的数倒序

这样就导致了每次操作都会使顺序颠倒一次+滚动更新

因此我们记录第1行和第一列更新后的位置

然后根据q的奇偶判断滚动/顺序情况

(具体见下代码)

CODE

#include<iostream>
using namespace std;
const int N=5e5+2;
int A,B,q,x,y,n,m;
char a[N],ans[N];
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%s",a+(i-1)*m+1);
	}
	x=1,y=1;
	cin>>q;
	for(int i=1;i<=q;i++){
		cin>>A>>B;
		x=(n+A-x+1)%n;
		y=(m+B-y+1)%m;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			int X,Y;
			if(q&1) X=(x-i+1+n)%n,Y=(y-j+1+m)%m;
			else X=(x+i-1+n)%n,Y=(y+j-1+m)%m;
			if(!X)X=n;
			if(!Y)Y=m;
			ans[m*(X-1)+Y]=a[(i-1)*m+j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			printf("%c",ans[(i-1)*m+j]);
		}
		printf("\n");
	}
	return 0;
}

w完结撒花❀

★,°:.☆( ̄▽ ̄)/$:.°★

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在无人机飞行控制中,需要对无人机的姿态进行控制,其中包括对其飞行方向的控制。当无人机发生姿态变化时,需要对其姿态进行插值,以保证飞行过程中的平稳性和稳定性。 具体来说,插值姿态可以通过以下步骤实现: 1. 通过传感器获取当前无人机的姿态信息,包括欧拉角或四元数等。 2. 根据控制算法计算出目标姿态,即无人机需要达到的姿态。 3. 使用姿态插值算法,将当前姿态和目标姿态进行插值,得到中间姿态。 4. 将中间姿态作为控制指令发送给无人机进行控制。 在插值算法中,常用的方法是线性插值和球面线性插值。线性插值是指在两个姿态之间进行线性插值,即将两个姿态之间的欧拉角或四元数进行线性插值,从而得到中间姿态。而球面线性插值是指在欧几里得空间中进行插值,即在两个姿态之间的球面上进行插值,从而得到中间姿态。 在具体实现中,可以使用相应的数学库,如numpy、scipy等,来实现插值算法。下面是一个简单的Python示例代码,用于对无人机的姿态进行插值: ```python import numpy as np from scipy.spatial.transform import Rotation as R # 获取当前和目标姿态 current_orientation = R.from_euler('xyz', [0, 0, 0], degrees=True) target_orientation = R.from_euler('xyz', [45, 0, 0], degrees=True) # 计算插值步长 steps = 10 step_size = 1.0 / (steps - 1) # 进行姿态插值 interpolated_orientations = [] for i in range(steps): slerp = R.from_slerp(step_size * i, current_orientation, target_orientation) interpolated_orientations.append(slerp.as_euler('xyz', degrees=True)) ``` 在上述代码中,我们使用`scipy`库的`Rotation`模块获取了当前和目标姿态,然后计算了插值步长,并使用`from_slerp()`方法进行球面线性插值,得到了中间姿态。最后,我们将插值后的姿态保存在`interpolated_orientations`列表中,可用于控制无人机的姿态。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值