OJ 1070: 小汽车的位置的指针解法(C/C++快速向)

1070: 小汽车的位置
时间限制: 1 Sec 内存限制: 128 MB

  有一辆智能小车,最初(时间为0)的位置为(0,0),我们想知道它最后的位置。小车以每小时10公里的速度向北移动(以北为y轴正向,以东为x轴正向)。小车会受到一系列依照时间戳记排序的命令,1表示“向左转”,2表示“向右转”,3表“停止”。每个命令的前面有一个时间戳记,所以我们知道该命令是何时发出的。最后一个命令一定是“停止”。我们另外假设,这辆小车非常灵活,它可以在瞬间转弯。
  以下列输入为例。小车在时间为5的时候收到一个“向左转”的命令1,在时间10收到一个“向右转”的命令2,在时间15收到一个“停止”的命令3。那么在最后时间15的时候,小车的位置将在(-50,100)。程序只要求输出小车最后的位置,第一个整数是x坐标,第二个整数是y坐标。
  思路:创建一个指针,抽象为方向,然后再创建四个数组,依次为北西南东,如果改变方向,就改p的值,并且可以给p指向的位置加值
  重点:要注意取模符%的计算方式,python和Java、C/C++是相反的,比如:-7%3=-1,7%(-3)=1,同时也要注意i的范围是在0~3内变化,不要让指针跑飞了。
C语言:

#include<stdio.h>
int main()
{
	int a[4]={0},i=0,x,y,time=0,b,time1=0,command,time2;//a[4]分为四个方向,a[0]为北.a[1]为西,a[2]为南,a[3]为东
	int *p=a;//让指针指向a[4],可以根据不同情况改变指针指向的位置
	while(1)//因为不知道循环次数,就用while无限循环
	{
		scanf("%d",&time);//先输入时间
		time2=time-time1;//得到时间差
		*p+=time2*10;//在p指向的位置上加上时间差*时速的距离
		time1=time;//保存当前的输入时间,依次让下一次时间相减得时间差
		scanf("%d",&command);//输入方向
		if(command==1)
		{
			i=(i+1)%4;//调整i的方向
			p=&a[i];
		}
		else if(command==2)
		{
			i=(i-1)%4;//这里非常重点,如果i为0时候减1时候,取模会得到负数,所以必须加上一个为负数的情况
			if(i<0)
			{
				i+=4;
			}
			p=&a[i];
		}
		else if(command==3)//如果输入的是3就跳出while
		{
			break;
		}
	}
	x=a[3]-a[1];//总结x轴的差
	y=a[0]-a[2];//总结y轴上的差
	printf("%d %d",x,y);
    return 0;
}

C++:

#include<iostream> 
int main()
{
	using std::cin;
	using std::cout;
	using std::endl;
	int a[4]={0},i=0,x,y,time=0,b,time1=0,command,time2;
	int *p=a;
	while(1)
	{
		cin>>time;
		time2=time-time1;
		*p+=time2*10;
		cin>>command;
		if(command==1)
		{
			i=(i+1)%4;
			p=&a[i];
		}
		else if(command==2)
		{
			i=(i-1)%4;
			if(i<0)
			{
				i+=4;
			}
			p=&a[i];
		}
		else if(command==3)
		{
			break;
		}
		time1=time;
	}
	x=a[3]-a[1];
	y=a[0]-a[2];
	cout<<x<<" "<<y<<endl;
    return 0;
}

  以上的计算过程虽然很简陋,但考察运算符的重点,不同的语言对于运算符的计算过程可能大有所不同,Python和Java与C/C++的%就完全相反,如果在%上出错,是较难找的细节,故应平时积累对运算符的扩展了解,并且运用娴熟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长高

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值