【洛谷】P1563 [NOIP2016 提高组] 玩具谜题

原题链接:点我
【洛谷】P1563 [NOIP2016 提高组] 玩具谜题
【洛谷】P1563 [NOIP2016 提高组] 玩具谜题
【洛谷】P1563 [NOIP2016 提高组] 玩具谜题
【洛谷】P1563 [NOIP2016 提高组] 玩具谜题
记录这道题的原因:
出现了“我觉得我没错但是我就是过不了”的问题。
没有找到错因,改了两版,放上来记录一下。也许以后就会了呢。(下次一定

第一版代码: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的范围内。

上一篇:【题解】[NOIP2016 提高组] 天天爱跑步


下一篇:P1909 [NOIP2016 普及组] 买铅笔