题意:就是三个人玩游戏,玩家分别为1,2,3,题目给出他们各自能走的步数,和总的格子数目N+1;
特别:对于第一个格子,是属于政府的,所以三个人可以同时占有,但是对于不是第一个,那么其他的如果是没有人走过的,那么这个人走到这个格子上,那么这个格子就是他的地盘了,如果他们其中一个人走到了别人的地盘,那么游戏就结束了;
这个模拟题真的打脑壳!!我刚开始还在找怎么把他们无限循环的情况找出来,结果看了大佬的代码;发现自己太菜了…;
还好,我的思路至少的对的!!!就是用一个book数组标记走的个字地盘,并且记录每个人走完一轮之后回到自己重复走的位置的次数,那么结束条件就是三个人都必须至少走到自己重复的位置的第一个位置那么这个就表示这个游戏会死循环了,所以:
1.用book记录+记录每个人重复走到走过的地盘的次数;
2.判断是否合法;
3.输出答案;
AC代码:
#include<bits/stdc++.h>
using namespace std;
int num[4],chongfu[4];
int book[100050];
int N, Vs, Vb ,Vl;
int Ss,Sb,Sl;
int f1;
void Book(int &S,int step,int remark){//标记
S=(S+step)%N;
if(S==0)return;
if(book[S]==0){//如果这个地方没有人走过,那么就标记是这个人的地盘了
book[S]=remark;
num[remark]++;
}else if(book[S]==remark){//如果走到自己重复的地方,那么记录走到重复地方的次数
chongfu[remark]++;
}else f1=1;//走到别人底盘了
}
bool Not_Valid(){
if(f1)return true;//如果走到别人的地盘了,那么就不合法了
else {
for(int i=1;i<=3;i++)
if(chongfu[i]<1)return false;//要保证三个人都要走到至少自己重复的位置1次
}
return true;
}
int main(){
scanf("%d%d%d%d%d",&N,&Vs,&Vb,&Vl);
N++;
int ans=0;
while(1){
Book(Ss,Vs,1);//只要执行了一次,肯定ans++;
ans++;
if(Not_Valid())break;
Book(Sb,Vb,2);
ans++;
if(Not_Valid())break;
Book(Sl,Vl,3);
ans++;
if(Not_Valid())break;
}
if(f1==1){
printf("%d",ans);
}
else puts("3000000000");
return 0;
}