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

发布了22 篇原创文章 · 获赞 159 · 访问量 9511

猜你喜欢

转载自blog.csdn.net/weixin_45677047/article/details/105240464