dfs+剪枝

本文探讨了一种使用深度优先搜索(DFS)结合剪枝策略解决数独问题的方法。通过DFS遍历所有可能的数字组合,并利用剪枝避免无效的搜索路径,以高效地找到所有不同的解决方案。在示例中,展示了如何计算特定条件下的数独方案数量,即每个方块代表1到13的不同数字组合。
摘要由CSDN通过智能技术生成

下图中,每个方块代表 1…13

中的某一个数字,但不重复。

例如:

1×2+9×7=13×5

10×8−12×3=11×4

只要有任意一个方块代表的数字不同,就算两种不同的方案。

请你计算,一共有多少种不同的方案。

#include <stdio.h>
int a[10];
int f[14];
int c=0;
void dfs(int step){
    if(step==5){
        int result1 = a[0]*a[1]+a[2]*a[3];
        int a1 = result1/a[4];
        if(f[a1]||a1>13||a1<1)
            return;//剪枝
    }
    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]){
                c++;
            }
        }
        return;
    }
    int i;
    for(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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值