题目链接:该题是luogu试炼场的2-1:T6
试炼场2-1题解包:
2-1 | 简单模拟 | |
题号 | 题目 | 备注 |
1003 | 铺地毯 | 逆向查找 |
1067 | 多项式输出 | 分段模拟 |
1540 | 机器翻译 | 循环队列 |
1056 | 排座椅 | 统计排序 |
1328 | 生活大爆炸版石头剪刀布 | 暴力模拟 |
1563 | 玩具谜题 | 环形思维 |
题目大意:
1 有n个小人站成一圈,有的脸朝圈外,有的脸超圈内;
2 有m条指令,按当前小人的方向,进行左右的数数;
3 求最后落点的小人信息。
解题思路:
1 用环形思维直接枚举
2 注意负方向:直接减法,要两次取模
3 正方向直接取模就好了
上代码:
#include<cstdio>
const int mx=100005;
int n,m,a[mx],z,b;
char s[mx][15];
int main()
{
scanf("%d %d",&n,&m);//n个人 m个指令
for(int i=1;i<=n;i++)
{
scanf("%d%s",&a[i],s[i]+1);
}
int x=1;
for(int i=1;i<=m;i++)
{
scanf("%d %d",&z,&b);
if(a[x]==0)//向内
{
if(z==0)//往左走
{
x-=b;
x%=n;
x=n+x;
x%=n;
}
else if(z==1)//往右走
{
x+=b;
x%=n;
}
}
else if(a[x]==1)//向外
{
if(z==1)//往左走
{
x-=b;
x%=n;
x=n+x;
x%=n;
}
else if(z==0)//往右走
{
x+=b;
x%=n;
}
}
if(x==0) x=n;
}
printf("%s",s[x]+1);
return 0;
}