题目来源 计蒜客程序设计竞赛基础课(蓝桥杯省赛) 算法标签 模拟 题目描述 思路 我们肯定会遇到的问题就是转向时候的朝向,所以你首先需要判定自己朝向哪边,才能方便转向 我们
题目来源 计蒜客程序设计竞赛基础课(蓝桥杯省赛)
算法标签 模拟
题目描述
思路
我们肯定会遇到的问题就是转向时候的朝向,所以你首先需要判定自己朝向哪边,才能方便转向
我们每次转向的时候需要面临的是,我现在朝向哪?我要转向到哪?
因此我在这里设置tmpdis表示临时需要转向到的朝向,way表示上一轮遗留下来的朝向 那么我们way+tmpdis更新之后就得到了当前的朝向
为了方便我们以顺时针为转向基准,设置右转为tmpdis=1,后转为2,左转为-1,向前为0 以更新后的way为依据,使用x,y横纵坐标位置进行加减
其次我们最重要的问题就是,当我们表示方向的数字中3为最大值,0为最小值,那么转向+1||-1,和后转+2这种方式就需要进行特判,针对转向从0到最大值3的变化。
if(tmpdis==1&&way==3)way=0;//如果我需要右转,且当前朝向左边,则新位置就是正前方 else if(tmpdis==2&&way==3)way=1;//如果我需要后转,且当前朝向左边,则新位置就是正右方 else if(tmpdis==-1&&way==0)way=3;//如果我需要左转,且当前朝向前边,则新位置就是正左方 else if(tmpdis==2&&way==2)way=0;//如果我需要后转,且当前朝向后边,则新位置就是正前方 else way+=tmpdis;AC代码
#include<iostream>using namespace std;int x,y;int way=1;//初始朝向右边void check(string s,int n){ //cout<<"x "<<x<<" "<<"y "<<y<<endl; if(way>3)way=0;//如果右转且朝向大于左边,则更新到正前方 int tmpdis=0;//需要转向的方向 if(s=="back")tmpdis=2; else if(s=="left")tmpdis=-1; else if(s=="right")tmpdis=1; else if(s=="forward")tmpdis=0; if(tmpdis==1&&way==3)way=0; else if(tmpdis==2&&way==3)way=1; else if(tmpdis==-1&&way==0)way=3; else if(tmpdis==2&&way==2)way=0; else way+=tmpdis; //if(way==0)cout<<"forward";else if(way==1)cout<<"right"; //else if(way==2)cout<<"back";else if(way==3)cout<<"left"; //cout<<" "<<n<<endl; if(way==0)y+=n; else if(way==1)x+=n; else if(way==2)y-=n; else if(way==3)x-=n; }int main(){ int n; cin>>n; string s; int tmpn=0; for(int i=0;i<n;i++) { cin>>s; cin>>tmpn; check(s,tmpn); } cout<<x<<" "<<y; return 0;}