P1563 玩具谜题

题目链接

P1563 玩具谜题

题目梗概

有n个小人围成一圈,有的朝内有的朝外。给出一串指示,如第一个人的左数第3个人的右数第1个人的左数第2个人。返回这个人的名字。

解题思路

虽然朝向有向内和向外,指示有向左和向右,两两组合共有四种情况,但实际上方向只有逆时针和顺时针两种方向。

内0外1左0右1顺0逆1
000
011
101
110

从表格中可以看出顺逆方向是内外左右的异或运算结果。
设下标指针为0,小人信息时是按照逆时针输入的的,当方向是逆时针时,下标增大,顺时针时,下标减小。
小人是围成圈的,所以当下标超过人数或者下标为负数时,需要通过取模等操作修正到正确的下标。

完整代码

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main(){
	int n, m;
	cin >> n >> m;
	vector<int> outward(n);
	vector<string> job(n);
	for(int i = 0;i < n; ++i){
		cin >> outward[i] >> job[i]; 
	}
	int idx = 0, dir, num;
	for(int i = 0;i < m; ++i){
		cin >> dir >> num;
		if(dir^outward[idx] == 1){
			idx += num;
		}else{
			idx -= num;
		}
		if(idx < 0) idx = n - (int)abs(idx)%n;
		if(idx >= n) idx %= n;
	}
	cout << job[idx];
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值