原题链接:点我
记录这道题的原因:
出现了“我觉得我没错但是我就是过不了”的问题。
没有找到错因,改了两版,放上来记录一下。也许以后就会了呢。(下次一定 )
第一版代码:85分,繁琐但是这是我的第一做法。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
int chaoxiang[100005],a[100005],distance[100005];
struct job
{
string name;
}j[100005];
cin>>n>>m;
//输入朝向和职业
for(int i=0;i<n;i++)
{
cin>>chaoxiang[i]>>j[i].name;
}
//逆时针寻找,temp是位置,从0开始;
int temp=0;
//输入寻找指令
for(int i=0;i<m;i++)
{
cin>>a[i]>>distance[i];
//第一个人的左边
if(a[i]==0)
{
if(chaoxiang[temp]==0)
{
temp=temp-distance[i];
if(temp<0) temp=temp+n;
}
else
{
temp=temp+distance[i];
if(temp>n) temp=temp-n;
}
}
//右边
else if(a[i]==1)
{
if(chaoxiang[temp]==0)
{
temp=temp+distance[i];
if(temp>n) temp=temp-n;
}
else
{
temp=temp-distance[i];
if(temp<0) temp=temp+n;
}
}
}
cout<<j[temp].name;
return 0;
}
第二版代码,查看了题解。
其中,若输入朝向和职业这里这样写:就会有两个点过不去。也许我以后就知道为什么了…
for(int i=1;i<=n;i++)
{
cin>>chaoxiang[i]>>j[i].name;
}
AC代码。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
int chaoxiang[100009];
struct job
{
string name;
}j[100009];
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>chaoxiang[i]>>j[i].name;
}
int x,y;
int temp=0;
for(int i=1;i<=m;i++)
{
cin>>x>>y;
if(chaoxiang[temp]==0&&x==0) temp=(temp+n-y)%n;
else if(chaoxiang[temp]==0&&x==1) temp=(temp+y)%n;
else if(chaoxiang[temp]==1&&x==0) temp=(temp+y)%n;
else if(chaoxiang[temp]==1&&x==1)temp=(temp+n-y)%n;
}
cout<<j[temp].name;
return 0;
}
学会了在某一范围内数字加减的方法:
temp=(temp+n-y)%n;
则在0到n-1的范围内。