C - Wandering Robot ZOJ - 4115

这篇博客主要探讨了如何解决ZOJ - 4115问题,即寻找机器人在行走过程中达到的最远距离。作者首先分享了一种错误思路,然后详细解释了正确解题方法:考虑最大值可能出现在首次行走过程或最终终点,并通过扩大终点坐标来找到答案。代码实现并不复杂。
摘要由CSDN通过智能技术生成

 


我先来说一下错误的思路,也就是我最原先的思路:

就是这个咱只求一个方向就行,

因为另一个方向是相同的道理

比如竖直方向

也就是Y轴

 

 

先求出第一次的最远距离


然后求一下第一次的终点

 



这样,我们就可以进行讨论了

 


讨论这个终点和最远距离的位置关系、

 


我给你画一个图

 

红色的是最大的那个点

、蓝色的是终点

水平和竖直是一样的道理,所以我就只画了一个竖直

 

如果是图一的话,需要判断终点在哪里

如果在下面则是 dis=max(maxL,abs(k*L));
L为距离原点的距离
大概就是这个意思

以上是我的思路,然后最后:

 

 

 

就是这样;然后我发现自己错了之后,哎好后悔,然后就直接做出来了(看了一下网上AC的代码);

大体思路就是:

出现最大值的位置出现在两个地方

1:在第一次走的过程中;

2:在最后的终点;

所以我们先找出第一次运行过程中的的最远距离,然后找出第一次的终点,这样我们把这个终点的坐标扩大K倍,然后再走一次,这一次也就是最后一次;

这样我们就可以得到最有解;

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;
const int N =1e6 +10;
#define boost ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); 
char str[N];

int main()
{
	boost;
	ll t,n,k;
	cin>>t;
//	scanf("%lld",&t);
	while(t--)
	{
//		scanf("%lld%lld",&n,&k);
		cin>>n>>k;
//		scanf("%s",str);
		cin>>str;
		ll maxl=0,x=0,y=0;
		
		for(int i=0;i<n;i++)
		{
			if(str[i]=='U') y++;
			if(str[i]=='D') y--;
			if(str[i]=='R') x++;
			if(str[i]=='L') x--;
			if(abs(x)+abs(y)>=maxl)
			maxl=abs(x)+abs(y);
		}
		x=(k-1)*x;
		y=(k-1)*y;
		
		for(int i=0;i<n;i++)
		{
			if(str[i]=='U') y++;
			if(str[i]=='D') y--;
			if(str[i]=='R') x++;
			if(str[i]=='L') x--;
			if(abs(x)+abs(y)>=maxl)
			maxl=abs(x)+abs(y);
		}
		cout<<maxl<<endl;
//		printf("%lld\n",maxl);
	}
	
	return 0;
}

我就不写注释了,代码不是很复杂;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值