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

Summer ·
更新时间:2024-11-13
· 806 次阅读

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


作者:长高



c+ oj C++ 汽车 指针

需要 登录 后方可回复, 如果你还没有账号请 注册新账号