走斜线

探讨了在方格地图上,如何计算一个角色在特定步数内到达目标位置时,能够走过的最大斜线数量。分析了不同路径选择的影响,并提供了一种高效的算法解决方案。

题目描述

   有天他来到一张方格地图上,整张地图可以看做一个二维坐标轴。牛牛此刻处于原点(0,0),他想要到点(x,y)去。牛牛有强迫症,他规定自己必须恰好k步走到点(x,y),中途可以经过任何点包括(x,y),但是第k步一定要到达(x,y)。
  一步有八种走法,直线东(+1,0)南(0,-1)西(-1,0)北(0,+1),斜线东南(+1,-1)东北(+1,+1)西南(-1,-1)西北(-1,+1)。牛牛会在能k步到达目的地的基础下尽量走斜线,你能计算出牛牛到底走了多少条斜线吗?

输入描述

  第一行一个整数T,代表数据组数。每组数据给出三个整数x,y,k。对于100%的数据,1<=T<=1000,
1<=x,y,k<=1000000000000000000。

输出描述

  对于每组数据,单独一行输出一个整数。如果牛牛可以在第k步的时候到达(x,y),输出牛牛走的斜线数量。如果牛牛不能到达,输出-1。

解题思路

  这道题感觉上和深搜类似,但实际差别很大,尤其是x,y,k的取值范围以及每一步的八个方向决定了搜索树相当大,因此深搜的方法不可靠。
  题目要求首先要能够在k步到达, 其次要求要尽量走斜线达到。关于是否能够在k步内到达,由于在地图上从(0,0)点开始行走,沿着斜线方向效率最高,比如沿着y=x这条线上所有点都是可以直接全部沿着斜线到达,并且至少需要x步,如果指定步数小于x,那么不可达。由此拓展,发现在x+y=2n的直线上的所有点都是可以完全通过走直线达到,并且可以发现达到这些点的最少步数为max(x,y)。对于这些完全通过斜线到达的点,如果指定步数大于需要的步数,那么剩余部分是偶数则这一部分完全可以通过走斜线消耗掉,是奇数则要用两条直线代替一条斜线(这部分画图就可以清楚)。
  对于那些不在上述线上的点,可以发现它的周围点都在这些线上,也就是说,走完斜线只需要再走一条直线就可以到达该点,达到该点的最小步数是周围点的最小步数加1。
  上述分析在画图的情况下十分清晰。

代码实现

#include <iostream>
using namespace std;
unsigned long long max(unsigned long long x,unsigned long long y){
	return x>y?x:y;
}
void getStep(unsigned long long x,unsigned long long y,unsigned long long k){
	unsigned long long minstep,remins;
    unsigned long long sum=x+y;
    unsigned long long result;
	if(sum%2==0){
		minstep=max(x,y);
		if(k<minstep)
			cout<<-1<<endl;
		else{
			remins=k-minstep;
			if(remins%2==0)
                cout<<k<<endl;     				
			else          
                cout<<k-2<<endl;       
		}
	}else{
		if(x>y)
			minstep=x-1;
		else
			minstep=y-1;
		if(k<minstep+1)
			cout<<-1<<endl;
		else
			cout<<k-1<<endl;
	}
	return;
}
int main(){
	unsigned long long t,x,y,k;
	cin>>t;
	while(t-->0){
		cin>>x>>y>>k;
		getStep(x,y,k);
	}
	return 0;
}
双轴舵机控制斜线通常可以通过以下步骤和方法实现: ### 原理分析 双轴舵机一般有两个独立的轴,通过分别控制两个轴的角度变化,可以使舵机带动的部件斜线轨迹。其核心在于根据目标斜线的斜率和长度,精确计算并同步控制两个轴的转动角度和速度。 ### 计算角度和速度 要控制双轴舵机斜线,需要根据目标斜线的起点和终点坐标,计算出两个轴分别需要转动的角度。设双轴舵机的两个轴分别为 X 轴和 Y 轴,目标斜线在 X 轴和 Y 轴上的位移分别为 $\Delta x$ 和 $\Delta y$,则可以通过三角函数计算出两个轴需要转动的角度 $\theta_x$ 和 $\theta_y$。 $\theta_x = \arctan(\frac{\Delta y}{\Delta x})$ $\theta_y = 90^{\circ} - \theta_x$ 同时,为了保证舵机在斜线过程中两个轴的运动同步,需要根据斜线的长度和期望的运动时间,计算出两个轴的转动速度。 ### 代码实现 以下是一个使用 Python 和 Arduino 控制双轴舵机斜线的示例代码: ```python import serial import time # 连接 Arduino 串口 ser = serial.Serial('COM3', 9600) # 目标斜线在 X 轴和 Y 轴上的位移 delta_x = 50 delta_y = 30 # 计算两个轴需要转动的角度 import math theta_x = math.degrees(math.atan(delta_y / delta_x)) theta_y = 90 - theta_x # 发送角度数据到 Arduino ser.write(str(theta_x).encode()) ser.write(b',') ser.write(str(theta_y).encode()) # 等待舵机运动完成 time.sleep(2) # 关闭串口连接 ser.close() ``` ```cpp #include <Servo.h> // 定义两个舵机对象 Servo servoX; Servo servoY; // 定义舵机控制引脚 const int servoXPin = 9; const int servoYPin = 10; void setup() { // 初始化串口通信 Serial.begin(9600); // 连接舵机 servoX.attach(servoXPin); servoY.attach(servoYPin); } void loop() { if (Serial.available() > 0) { // 读取角度数据 String data = Serial.readStringUntil('\n'); int commaIndex = data.indexOf(','); int theta_x = data.substring(0, commaIndex).toInt(); int theta_y = data.substring(commaIndex + 1).toInt(); // 控制舵机转动 servoX.write(theta_x); servoY.write(theta_y); } } ``` ### 注意事项 - 在实际应用中,需要根据舵机的型号和性能,调整转动速度和角度范围,以确保舵机能够稳定、准确地斜线。 - 由于舵机的转动存在一定的误差,可能需要进行校准和补偿,以提高斜线运动的精度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值