计蒜客蓝桥杯模拟赛5 补全等式

题目描述:
下图中,每个方块代表 1…13 中的某一个数字,但不重复。
这里写图片描述
例如:
1×2+9×7=13×5
10×8-12×3=11×4
只要有任意一个方块代表的数字不同,就算两种不同的方案。
请你计算,一共有多少种不同的方案。

思路:我们可以看到12个空13个可选值,很明显暴力啥的会要等很久才会有结果,所以这里需要有点小技巧,我们遍历前5个空吧,最后一个空可以通过前5个空计算出,第二排也类似。这样可以少枚举2个空。。过程可以小剪枝,随便你,没剪枝大概10-20s出结果,也算比较慢了。

代码:

int a[10];
int f[14];
int c=0;
void dfs(int step){
    if(step==10){
        int result1 = a[0]*a[1]+a[2]*a[3];
        int result2 = a[5]*a[6]-a[7]*a[8];
        if(result1%a[4]==0&&result2%a[9]==0){
            int a1 = result1/a[4];
            int a2 = result2/a[9];
            if(a1<=13&&a1>=1&&a2<=13&&a2>=1&&a1!=a2&&!f[a1]&&!f[a2]){
                //printf("%dX%d+%dX%d=%dX%d\n",a[0],a[1],a[2],a[3],a[4],a1);
                //printf("%dX%d-%dX%d=%dX%d\n",a[5],a[6],a[7],a[8],a[9],a2);
                c++;
            }
        }
        return;
    }
    for(int i = 1;i<=13;i++){
        if(!f[i]){
            f[i] = 1;
            a[step] = i;
            dfs(step+1);
            f[i] = 0;
            a[step] = 0;
        }
    }
}
int main(){
    dfs(0);
    printf("%d",c);//122368
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值