HDU1033 Edge

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


 

你可能感兴趣的:(ACM)