P1092 虫食算

3 篇文章 0 订阅
从低位开始枚举,若该列已填满进行判断,填了两个数进行计算,否则进行搜索。
引入邻接表可以跑得更快。
一开始第九个点总是T,尝试了倒着取数,但反而跑得更慢。因此将程序中的if和else有选择性地换了一下,爆了几发OJ,最后 在O2开关的帮助下 成功骗自己A掉了这题
搞笑代码:
#prag\
ma GC\
C opti\
mize("O\
2") 
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
using namespace std;
#define rep(i,j,k) for(i=j;i<=k;++i)
#define per(i,j,k) for(i=j;i>=k;--i)
#define ll long long
#define db double
#define mkp(x,y) make_pair(x,y)
#define pii pair<int,int>
#define X first
#define Y second
int n,a1[26],a2[26],a3[26],c[26],L[26],R[26];
bool b[26];
void read(int a[]){
    char s[27];scanf("%s",s);
    int i;per(i,n-1,0)a[i]=s[i]-'A';
}
void del(int x){
    R[L[x]]=R[x];L[R[x]]=L[x];
}
void add(int x){
    R[L[x]]=L[R[x]]=x;
}
void DFS(int k,bool flg){
    if(k<0){
        if(flg)return;
        int i;rep(i,0,n-1)printf("%d ",c[i]);puts("");exit(0);
    }
    bool flg2=0;int x,y,z;
    if((x=c[a1[k]])>=0&&(y=c[a2[k]])>=0){
        z=x+y+flg;
        if(z>=n)z-=n,flg2=1;
        if((c[a3[k]])>=0){
            if(c[a3[k]]==z)DFS(k-1,flg2);
            else return;
        }
        else{
            if(b[z])return;
            b[c[a3[k]]=z]=1;del(z);
            DFS(k-1,flg2);
            b[z]=0;c[a3[k]]=-1;add(z);
        }
        /*if((c[a3[k]])<0){
            if(b[z])return;
            b[c[a3[k]]=z]=1;del(z);
            DFS(k-1,flg2);
            b[z]=0;c[a3[k]]=-1;add(z);
        }
        else{
            if(c[a3[k]]==z)DFS(k-1,flg2);
            else return;
        }*/
        return;
    }
    else if((z=c[a3[k]])>=0){
        /*if((x=c[a1[k]])>=0){
            z-=flg;
            if(x<=z){
                if(b[y=z-x])return;
                b[c[a2[k]]=y]=1;del(y);
                DFS(k-1,0);
                b[y]=0;c[a2[k]]=-1;add(y);
            }
            else{
                if(b[y=z+n-x])return;
                b[c[a2[k]]=y]=1;del(y);
                DFS(k-1,1);
                b[y]=0;c[a2[k]]=-1;add(y);
            }
            return;
        }*/
        if((x=c[a1[k]])>=0){
            z-=flg;
            if(x>z){
                if(b[y=z+n-x])return;
                b[c[a2[k]]=y]=1;del(y);
                DFS(k-1,1);
                b[y]=0;c[a2[k]]=-1;add(y);
            }
            else{
                if(b[y=z-x])return;
                b[c[a2[k]]=y]=1;del(y);
                DFS(k-1,0);
                b[y]=0;c[a2[k]]=-1;add(y);
            }
            return;
        }
        if((y=c[a2[k]])>=0){
            z-=flg;
        /*    if(y>z){
                if(b[x=z+n-y])return;
                b[c[a1[k]]=x]=1;del(x);
                DFS(k-1,1);
                b[x]=0;c[a1[k]]=-1;add(x);
            }
            else{
                if(b[x=z-y])return;
                b[c[a1[k]]=x]=1;del(x);
                DFS(k-1,0);
                b[x]=0;c[a1[k]]=-1;add(x);
            }
      */      if(y<=z){
                if(b[x=z-y])return;
                b[c[a1[k]]=x]=1;del(x);
                DFS(k-1,0);
                b[x]=0;c[a1[k]]=-1;add(x);
            }
            else{
                if(b[x=z+n-y])return;
                b[c[a1[k]]=x]=1;del(x);
                DFS(k-1,1);
                b[x]=0;c[a1[k]]=-1;add(x);
            }
            return;
        }
    }
    int i;
    if((c[a1[k]])>=0){
        for(i=L[n];i!=n+1;i=L[i]){
            b[c[a2[k]]=i]=1;del(i);DFS(k,flg);
            b[i]=0;add(i);
        }
        c[a2[k]]=-1;
    }
    else{
        for(i=L[n];i!=n+1;i=L[i])if(!b[i]){
            b[c[a1[k]]=i]=1;del(i);DFS(k,flg);
            b[i]=0;add(i);
        }
        c[a1[k]]=-1;
    }
}
int main(){
    scanf("%d",&n);read(a1);read(a2);read(a3);
    memset(c,-1,sizeof c);
    int i;
    per(i,n-1,0)L[R[i]=i+1]=i;
    R[L[0]=n+1]=0;
    DFS(n-1,0);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值