A. Amsopoly Simple Version(思维枚举题)

在这里插入图片描述在这里插入图片描述在这里插入图片描述
题意:就是三个人玩游戏,玩家分别为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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值