bzoj1508: [NOI2003]Game

传送门
Claris代码风格实在是不忍直视。
直接爆枚是单个数字上修改还是从一个数字移到另一个数字。
只是读入输出炒鸡麻烦。

#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 1010
#define debug printf("sb\n");
using namespace std;
char s[N];
int n,m,i,j,k,I,J,K,pos;
int a[10][10],b[10][10],Pow[10],v[N],w[N];
int e[N][10],l[N];
long long sum,tmp;
void print(){
    for (i=1;i<=pos;i++){
        if (i>1) putchar(w[i]==1?'+':'-');
            else if (w[i]!=1) putchar('-');
        for (int j=l[i]-1;~j;j--) printf("%d",e[i][j]);
    }
    putchar('=');
    for (;i<=n;i++){
        if (i>pos+1) putchar(w[i]!=1?'+':'-');
            else if (w[i]==1) putchar('-');
        for (int j=l[i]-1;~j;j--) printf("%d",e[i][j]);
    }
    putchar('#');
    exit(0);
}
int main(){
    Pow[0]=1;
    for (i=1;i<8;i++) Pow[i]=Pow[i-1]*10;
    a[0][6]=a[0][9]=a[2][3]=a[3][2]=1;
    a[3][5]=a[5][3]=a[6][0]=a[6][9]=1;
    a[9][0]=a[9][6]=b[0][8]=b[1][7]=1;
    b[3][9]=b[5][6]=b[5][9]=b[6][8]=b[9][8]=1;
    scanf("%s",s+1);
    n=1;
    if (s[1]=='-') i=2,w[1]=-1;
    else i=w[1]=1;
    for (;s[i]>='0'&&s[i]<='9';i++){
        v[n]=v[n]*10+s[i]-48;
        e[n][l[n]++]=s[i]-'0';
    }
    while (s[i]!='='){
        w[++n]=(s[i++]=='+')?1:-1;
        for (;s[i]>='0'&&s[i]<='9';i++){
            v[n]=v[n]*10+s[i]-48;
            e[n][l[n]++]=s[i]-'0';
        }
    }
    pos=n++;
    if (s[++i]=='-') i++,w[n]=1;
    else w[n]=-1;
    for (;s[i]>='0'&&s[i]<='9';i++){
        v[n]=v[n]*10+s[i]-48;
        e[n][l[n]++]=s[i]-'0';
    }
    while (s[i]!='#'){
        w[++n]=(s[i++]=='+')?-1:1;
        for (;s[i]>='0'&&s[i]<='9';i++){
            v[n]=v[n]*10+s[i]-48;
            e[n][l[n]++]=s[i]-'0';
        }
    }
    for (i=1;i<=n;i++){
        sum+=v[i]*w[i];
        for (j=0,k=l[i]-1;j<k;j++,k--)
            swap(e[i][j],e[i][k]);
    }
    for (i=1;i<=n;i++)
        for (j=0;j<l[i];j++)
            for (k=0;k<=9;k++)
                if (a[e[i][j]][k]){
                    tmp=sum+w[i]*(k-e[i][j])*Pow[j];
                    if (!tmp){
                        e[i][j]=k;
                        print();
                    }
                }
    for (i=1;i<=n;i++)
        for (j=0;j<l[i];j++)
            for (I=1;I<=n;I++)
                for (J=0;J<l[I];J++)
                    if (I!=i||J!=j)
                        for (k=0;k<=9;k++)
                            for (K=0;K<=9;K++)
                                if (b[e[i][j]][k]&&b[K][e[I][J]]){
                                    tmp=sum+w[i]*(k-e[i][j])*Pow[j]+w[I]*(K-e[I][J])*Pow[J];
                                    if (!tmp){
                                        e[i][j]=k; e[I][J]=K;
                                        print();
                                    }
                                }
    puts("No");                        
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值