HDU1033 Edge
现在有一个固定初始坐标(300.420)的点,它按照一定的操作命令序列每向前走10个单位长度的距离就左转(V)或右转(A)。现在要每个操作命令序列来输出这个点的轨迹(并遵循一定的格式)。
输入:每一行是一个实例。每行包含一个非空的长度不超过200的由A和V构成的字符串。以文件结束符表示输入结束。
输出:对于每个输入实例,以以下的例子作为输入标准。
以上图片代表两个实例:V和AVV
实例V的输出为:
300 420 moveto
310 420 lineto
310 430 lineto
stroke
showpage
实例AVV的输出为:
300 420 moveto
310 420 lineto
310 410 lineto
320 410 lineto
320 420 lineto
stroke
showpage
分析:由此可得输出中,300 420 moveto 与310 420 lineto与stroke 与showpage是必须的,然后中间的 X,Y lineto 是起始点通过执行A或V所到达的一个个后续点。点的当前运行方向只有4个0,1,2,3分别代表左,右,上,下。执行A操作时,方向对应会改变成以下4个,上,下,右,左。执行V操作时,方向对应会改变成以下4个,下,上,左,右。
另外4个方向,左,右,上,下,对应的x,y坐标增减也是一目了然的。
一步一步模拟即可。
AC代码:
#include<cstdio> #include<string> #include<iostream> using namespace std; const int L=0,R=1,U=2,D=3;//代表左右上下4方向 int dir_A[]={U,D,R,L};//执行A右转操作时4个方向变为对应的UDRL方向 int dir_V[]={D,U,L,R};//执行V左转操作时4个方向变为对应的DULR方向 int dx[]={-10,10,0,0};//左右上下4方向对应的X坐标增量 int dy[]={0,0,10,-10};//y增量 int main() { string com; while(cin>>com)//读命令 { cout<<"300 420 moveto"<<endl; cout<<"310 420 lineto"<<endl; intx=310,y=420;//初始的坐标 intcur_dir = 1;//初始的方向始终向右 for(inti=0;i<com.size();i++) { charc=com[i];//命令 intnew_dir ;//新的方向 if(c=='A') { new_dir = dir_A[cur_dir]; x+=dx[new_dir];//新方向X增量 y+=dy[new_dir];//新方向Y增量 } else { new_dir = dir_V[cur_dir]; x+=dx[new_dir]; y+=dy[new_dir]; } cur_dir=new_dir;//更新当前方向 cout<<x<<" "<<y<<"lineto"<<endl; } cout<<"stroke"<<endl; cout<<"showpage"<<endl; } return 0; }