题目重点在于模拟。
先使用数组模拟环状数组,数组中记录小人的朝向
,需要注意数组的循环问题,数组下标需要取余。
由模拟得当朝向圈内向左数或朝向圈外向右数时,数组下标向前数,反之向后数,想象不来的可以画一个圆环模拟一下。
我在程序里犯的一个错是没有给移动的人数取余,比如一个7人的环,向前移动2和移动9和移动16等等是一样的,需要取余我没有取余导致了最后算得的数组下标超过了数组的范围,导致运行时发生了段错误。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int* p = new int[n];//数组记录朝向
string* pstr = new string[n];//记录小人职业
for (int i = 0; i < n; i++)
{
cin >> p[i] >> pstr[i];
}
int index = 0;
int a, b;
for (int i = 0; i < m; i++)
{
cin >> a >> b;
if ((p[index] == 0 && a == 0)
|| (p[index] == 1 && a == 1))
{
b = b % n;//取余
index -= b;
if (index < 0)index = n + index;//确保数组是循环的
}
else if ((p[index] == 1 && a == 0)
|| (p[index] == 0 && a == 1))
{
b = b % n;//取余
index += b;
if (index > n - 1) index = index - n;//确保数组是循环的
}
}
cout << pstr[index];
return 0;
}