这一题我本来想用双向链表写的,但是发现好像运用数学知识可以将普通的数组连成一个环,就没有去考虑链表了。
这一题的关键应该就在于判断玩具小人该往顺时针走还是逆时针走,可以通过列举发现,如果方向和玩具小人对应的数字相同,则为顺时针转,反之则为逆时针,这样只用判断一次就可以了。
下图为判断方向。
if(dir==a[i].num){
flag=false;
}else{
flag=true;
}
逆时针很简单,只要求余数就可以了。
顺时针可以看成逆时针往前走,就像一个直角一样,你可以看成90°,也可以看成(360-90)°,形状都是一样的。只要总人数减去顺时针的步数即可,如果是负数,则说明还要走一圈,重复到正数即可。
while判断中的 <= 其实改成 < 也是一样的。求余之后都是一样的。
if(flag){//处理逆时针
i=(i+step)%n;
}else{//处理顺时针,顺时针看成逆时针,进行转换
int t=n-step;
while(t<=0){
t=t+n;
}
i=(i+t)%n;
}
ac代码
#include<iostream>
#include<iomanip>
#include<cstring>
#include<sstream>
#include<algorithm>
using namespace std;
//定义一个结构体来存放一类相同的变量
struct people
{
int num=0;
string job;
};
int main(){
int n,m;
cin>>n>>m;
people a[n];
for(int i=0;i<n;i++){//从a[0]开始算,这样等一下处理数据好处理
cin>>a[i].num>>a[i].job;
}
int i=0;
for(int j=0;j<m;j++){
bool flag=true;//来判断顺时针还是逆时针,false为顺时针,true为逆时针。
int dir,step;
cin>>dir>>step;
if(dir==a[i].num){
flag=false;
}else{
flag=true;
}
if(flag){//处理逆时针
i=(i+step)%n;
}else{//处理顺时针,顺时针看成逆时针,进行转换
int t=n-step;
while(t<=0){
t=t+n;
}
i=(i+t)%n;
}
}
cout<<a[i].job<<endl;
system("pause");
return 0;
}