JRKSJ T4求助
  • 板块学术版
  • 楼主cmll02
  • 当前回复5
  • 已保存回复5
  • 发布时间2021/2/3 20:14
  • 上次更新2023/11/5 03:49:43
查看原帖
JRKSJ T4求助
171487
cmll02楼主2021/2/3 20:14

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]);
   }
}
2021/2/3 20:14
加载中...