ps:最开始没有考虑跳的格子有可能不是单个数字字母,比如有可能是G11之类的,没想到CG竟然能过,离谱。
离谱,离谱,我不小心把两个玩家到达同一位置的情况看反了,cg竟然也能全过。
(1)第一个代码是我两个玩家分开写的:虽然代码看着比较长,但是有一半是重复,把两个分开记录,比较方便。要是发现错误,欢迎反馈哦。
(2)第二个代码是一起写得。还是第二个代码看着舒服写。
ps:要是有更好,更新颖的方法,欢迎分享
【两个玩家分开】
#include <iostream>
#include <sstream>
using namespace std;
int main(){
int n,A,B,C,grap[200];
string str;
while(cin>>n>>A>>B>>C)
{
for(int i=0;i<n;i++)
{
cin>>str;
if(str=="N") grap[i]=-1;
else{
stringstream ss; int tmp;
str=str.substr(1);//将G去掉
ss<<str;
ss>>tmp;
grap[i]=tmp;
}
}
int step1,step2,mark=0;
int F0,F1,p1=0,p2=0;
F0=(A*C+B)%6+1;
F1=(A*F0+B)%6+1;
while(1)
{
step1=F0;//第一个人走的情况
p1=p1+step1;//假设能一直走step1格,然后下面判断是否可以
if(p1==n-1)//达到终点的情况
{
cout<<"Lele"<<'\n';
break;
}
else if(p1<n-1)//未超过终点的情况
{
if(p1==p2) p2=0;//与第二个人相遇的情况
else//如果没有相遇
{
while(grap[p1]!=-1)//不能在所在的格子停留
{
p1=grap[p1];
if(p1==n-1)
{
mark=1;
cout<<"Lele"<<'\n';
break;
}
if(p1==p2) p2=0;
}
if(mark==1) break;//判断第一个人是否到达终点,到达终点游戏结束
}
}
else if(p1>n-1)//超过终点的情况
{
p1=n-p1%(n-1)-1;
while(grap[p1]!=-1)//判断在走了step1步后是否可以停留
{
p1=grap[p1];
if(p1==n-1) //判断是否到终点
{
mark=1;
cout<<"Lele"<<'\n';
break;
}
if(p1==p2) p2=0;
if(mark==1) break;// 判断第一个人是否到达终点,到达终点游戏结束
}
}
//第二个人的与第一个人操作一样
step2=F1;
p2=p2+step2;
if(p2==n-1)
{
cout<<"Yueyue"<<'\n';
break;
}
else if(p2<n-1)
{
if(p1==p2) p1=0;
else
{
while(grap[p2]!=-1)
{
p2=grap[p2];
if(p2==n-1)
{
mark=1;
cout<<"Lele"<<'\n';
break;
}
if(p1==p2) p1=0;
if(mark==1) break;
}
}
}
else if(p2>n-1)
{
p2=n-p2%(n-1)-1;
while(grap[p2]!=-1)
{
p2=grap[p2];
if(p2==n-1)
{
mark=1;
cout<<"Yueyue"<<'\n';
break;
}
if(p1==p2) p1=0;
if(mark==1) break;
}
}
F0=(A*F1+B)%6+1;
F1=(A*F0+B)%6+1;
}
}
}
【两个玩家合并写】
#include <iostream>
#include <sstream>
using namespace std;
int main(){
int n,a,b,c,step,p1,p2,grap[200];
string str;
while(cin>>n>>a>>b>>c)
{
for(int i=0;i<n;i++)
{
cin>>str;
if(str=="N") grap[i]=-1;
else{
stringstream ss; int tmp;
str=str.substr(1);//将G去掉
ss<<str;
ss>>tmp;
grap[i]=tmp;
}
}
p1=0;p2=0;step=(a*c+b)%6+1;
for(int i=0;;i++)
{
if(p1==n-1)
{
cout<<"Lele"<<endl;
break;
}
if(p2==n-1)
{
cout<<"Yueyue"<<endl;
break;
}
if(i%2==0)
{
p1+=step;
if(p1>=n) p1=n-1-p1%(n-1);
if(grap[p1]!=-1) p1=grap[p1];
if(p1==p2&&p1!=0) p2=0;
}
else
{
p2+=step;
if(p2>=n) p2=n-1-p2%(n-1);
if(grap[p2]!=-1) p2=grap[p1];
if(p1==p2&&p2!=0) p1=0;
}
step=(a*step+b)%6+1;
}
}
}