关于循环问题的注意事项(例题:玩具谜题)
#include <bits/stdc++.h> using namespace std; #define maxn 100010 int n,m,k=1,c[maxn]; bool a[maxn],b[maxn]; string s[maxn]; inline int in(){ //ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]>>s[i]; for(int i=1;i<=m;i++) cin>>b[i]>>c[i]; } inline int work(){ for(int i=1;i<=m;i++){ if(a[k]==0 and b[i]==0){k=k-(c[i]%n); if(k<=0) k+=n; continue;} if(a[k]==0 and b[i]==1){k=(k+c[i])%n; if(k==0) k=n; continue;} //cautious:这其实是循环的套路现在再打代码有了之前的积累会更快了 (左右处理) if(a[k]==1 and b[i]==0){k=(k+c[i])%n; if(k==0) k=n; continue;} if(a[k]==1 and b[i]==1){k=k-(c[i]%n); if(k<=0) k+=n; continue;} } //1cautious:循环问题使用除法时一定注意对于零的处理 ,而且是每一个除和取余 //2cautious:注意当k=0的边界情况容易判断错(最后一次更改这儿错了) } inline int out(){ cout<<s[k]; } int main(){ freopen("toya.in","r",stdin); freopen("toya.out","w",stdout); in(); work(); out(); }