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;
}