先分析一下这个题目:
1.当小人朝外的时候,他的右边就是顺时针,他的左边就是逆时针。
2.当小人朝内的时候,他的左边时顺时针,他的右边时逆时针。
可以总结一下:
假设朝外为1,朝内为0;右边为1,左边为0.
则有(朝向:方向)
朝向:方向 | 顺逆 |
---|---|
1:0 | 逆时针 |
1:1 | 顺时针 |
0:0 | 顺时针 |
0:1 | 逆时针 |
很明显找到规律,当朝向和方向一致的时候顺时针,否则逆时针.
先放一个没有优化的代码,满分ac,但是写的不好,用的循环队列写的
#include<stdio.h>
#pragma warning (disable:4996)
struct people
{
int face;
char name[11];
}people[100000];
struct act
{
int dir;
long long int move;
}act[100000];
int main()
{
int n, m;
int str = 0; //伪指针
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
scanf("%d %s", &people[i].face, people[i].name);
for (int i = 0; i < m; i++)
scanf("%d%d", &act[i].dir, &act[i].move);
for (int i = 0; i < m; i++)
{
long long int move = act[i].move;
if (act[i].dir == people[str].face) //方向和朝向相同,顺时针,即(朝向外侧的右边等于朝向内侧的左边)
{
move = move - move / n * n;
str = (n + str - move) % n;
}
else //方向和朝向不同,逆时针
{
str = (str + move) % n;
}
}
printf("%s", people[str].name);
return 0;
}
下面是优化的代码:
#include<stdio.h>
struct people
{
int face;
char name[11];
}people[100000];
int main()
{
int n, m;
int dir, move; //朝向,移动的步数
int str = 0; //str最后指向拿帽子人
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
scanf("%d%s", &people[i].face, people[i].name);
for (int i = 0; i < m; i++)
{
scanf("%d%d", &dir, &move);
if (people[str].face == dir) //朝向一样,,顺时针
str = (str + n - move) % n;
else //朝向不一样,逆时针
str = (str+n+move) % n;
}
printf("%s", people[str].name);
return 0;
}