RT,写了个暴力的dfs,WA了#7#8,求助
#include <stdio.h>
#include <iostream>
inline int read()
{
int num=0,f=1;char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>47&&c<58)num=(num<<3)+(num<<1)+(c^48),c=getchar();
return num*f;
}
struct state {
int x[2],y[2];
state operator=(const state &b){
x[0]=b.x[0],x[1]=b.x[1];
y[0]=b.y[0],y[1]=b.y[1];
return *this;
}
void inv()
{
int u=x[0];x[0]=y[0],y[0]=u;
u=x[1],x[1]=y[1],y[1]=u;
}
}s;
int atk(int* a)
{
int u=a[0]<a[1]?a[0]:a[1],v=a[0]+a[1]-u;
if(u==1&&v==9)return 2;
if((u==3&&v==3)||(u==3&&v==5)||(u==1&&v==6))return 1;
return 0;
}
int fng(int* a)
{
int u=a[0]<a[1]?a[0]:a[1],v=a[0]+a[1]-u;
if(u==5&&v==5)return 2;
if(u==1&&v==5)return 1;
return 0;
}
void upd(state &s,int op)
{
if(op==0)
{
s.x[0]%=10;
s.x[1]%=10;
s.y[0]%=10;
s.y[1]%=10;
if(atk(s.x)==0)return;
if(atk(s.x)==2)s.y[0]=s.y[1]=1;
else if(fng(s.y)==2)s.y[1]=1;
else s.y[0]=s.y[1]=1;
}
else
{
s.x[0]%=10;
s.x[1]%=10;
s.y[0]%=10;
s.y[1]%=10;
if(atk(s.y)==0)return;
if(atk(s.y)==2)s.x[0]=s.x[1]=1;
else if(fng(s.x)==2)s.x[1]=1;
else s.x[0]=s.x[1]=1;
}
}int b;
int gd(state s,int q)
{
//if(atk(s.y)>fng(s.x))return 0;
if((b==10||b<7||b==9)&&q==9)return 1;
if((b==7||b==8)&&q==11)return 1;
int ans=0,x=0;state p;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
{
p=s;
p.x[i]+=p.y[j];
p.x[i]%=10;//printf("%d : %d %d - %d %d %d %d --- %d %d\n",q,i,j,p.x[0],p.x[1],p.y[0],p.y[1]);
if(atk(p.x)>fng(p.y))return 2;
upd(p,0);
p.inv();x=gd(p,q+1);
if(x==0)return 2;
if(x==1)ans=1;
}
return ans;
}
int r[2][2];
int ret(int i,int j,char p)
{
std::cout<<i<<p<<j<<std::endl;
s.x[i]+=s.y[j];
return 0;
}
int ext()
{
state p=s;
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
p=s;
p.x[i]+=p.y[j];
p.x[i]%=10;
if(atk(p.x)>fng(p.y))r[i][j]=2;
else upd(p,0),p.inv(),r[i][j]=2-gd(p,0);
if(r[i][j]==2)return ret(i,j,' ');
}
}
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
if(r[i][j]==1)return ret(i,j,' ');
}
}
std::cout<<"0 0"<<std::endl;
return 0;
}
int main()
{
//s.x[0]=5,s.x[1]=4,s.y[0]=9,s.y[1]=6;
//std::cout<<gd(s,0)<<std::endl;
//s//.x[1]=3;
//std::cout<<atk(s.x)<<fng(s.y)<<std::endl;
s.x[0]=read(),s.x[1]=read();
s.y[0]=read(),s.y[1]=read(); b=read();
while(1)
{
ext();upd(s,0);
//printf("%d %d %d %d\n",s.x[0],s.x[1],s.y[0],s.y[1]);
int p,q;
if(-1==scanf("%d %d",&p,&q))break;
s.y[p]+=s.x[q];
upd(s,1);
//printf("%d %d %d %d\n",s.x[0],s.x[1],s.y[0],s.y[1]);
}
}