有一辆智能小车,最初(时间为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++的%就完全相反,如果在%上出错,是较难找的细节,故应平时积累对运算符的扩展了解,并且运用娴熟。