洛谷 P1563 玩具谜题

如果你想不耗费脑力做出这个题目,往下看:

本萌新看到这个题目,想到了乘法法则,题目中左右方向要判断两次,很耗脑力,和乘法中的正负号判断非常像。

抽象一点:这个人向内向外就是乘法中括号外的正负号,他的左右方向是括号内的正负号,所以我们以singer为标准,每个人的 0 (朝内)为 1 ,每个人的 1 (朝外)为 -1 。

而他们的左右方向,因为题目图中是逆时针走向,所以和他们的朝内朝外是相反的,故判断每个人左右方向时, 0 为 -1 , 1 为 1 。

最后将两个判断方向的数乘起来(这事当然交给电脑了),就是最终方向。代码如下:

#include<iostream>
using namespace std;
int n,m,a,b,i,num[100001];
string name[100001];//准备工作 
int main(){
	cin>>n>>m;
	for(i=1;i<=n;i++){
		cin>>num[i]>>name[i];//输入 
		if(num[i]==0)num[i]=1;
		else num[i]=-1;//以singer朝向为准,0为1,1为-1; 
	}
	i=1;//从第一个开始循环 
	while(m){
		cin>>a>>b;
		if(a==0)a=-1;//题目的图中为逆时针,故 1为1,0为-1; 
		i+=num[i]*a*b;//乘法法则,把方向判断扔给电脑去算; 
		if(i<1)i=n+i;//边界情况
		if(i>n)i%=n;//把他们围成一个圈 
		m--;
	}
	cout<<name[i];//输出,圆满 
    return 0;
}
posted @ 2018-10-30 20:20  一只不咕鸟  阅读(238)  评论(0编辑  收藏  举报