题目:找试场
题目描述
小王同学在坐标系的(0,0)处,但是他找不到考试的试场,于是一边走路一边问路,每个被问路的人会告诉他一个指令(包括走路或转弯),现在请编一个程序,显示他每次走路后的坐标(转弯后不必显示坐标)。
数据范围
对于50 %的数据,0<n <=20,对于100 %的数据,0<n <=500, 所有数据都在longint范围内。
输入格式
第一行一个数n,表示有n个指令,接下来n行每行一个指令,每个指令是“left” 或“right”或数字。
输出格式
(有m个走路的指令)共m行,每一行一个坐标,表示走完后的坐标。如果只是原地转弯,从来不走动,则输出“(0,0)”.
题解:———————————————————————————————————————————————————
第一次做这样的题,看了别人的题解才明白,设定一个指示方向的变量,但向左转时step+3,向右转时step+1,向右转三次相当于向左转一次。
代码实现:
#include<iostream> using namespace std; int main() { int x,y,i,n;int b[501][2]; cin>>n; x=y=0; memset(b,-1,sizeof(b)); int step=0; for(i=1;i<=n;i++) { char a[30]; cin>>a; if(0<=a[0]-'0'&&a[0]-'0'<=9) { int k,j=0,l=1; k=strlen(a); while(k>0) { j=j+(a[k-1]-'0')*l; l=l*10; k--; } switch(step){ case 0:y=y+j;break; case 1:x=x+j;break; case 2:y=y-j;break; case 3:x=x-j;break; } b[i][0]=x;b[i][1]=y; } else if(a[0]=='r') {step=step+1;step=step%4;} else if(a[0]=='l') {step=step+3;step=step%4;} } bool p=0; for(i=1;i<=n;i++) if((b[i][0]!=0||b[i][1]!=0)&&b[i][0]!=-1) p=1; if(p==0) {cout<<"(0,0)"<<endl;return 0;} for(i=1;i<=n;i++) if(b[i][0]!=-1) cout<<"("<<b[i][0]<<","<<b[i][1]<<")"<<endl; return 0; }